【问题标题】:How do I do a multirow formula?我如何做一个多行公式?
【发布时间】:2019-04-04 19:23:59
【问题描述】:

我正在尝试使用多行公式来创建一个新的计算列,但无法完全弄清楚。

假设我的数据是这样的:

x     y

1     2

1     2

1     6

1     7

2     4

2     5

2     9

我想创建一个计算列 z,其中包含以下逻辑:

如果 x 的值等于 x 的前一个值,则 y-previous(x) 否则为 0。

【问题讨论】:

  • 首先要做的是指定你想要的第一个值。
  • 并为您的示例数据提供一些预期的输出。
  • @divibisan :我不认为这是重复的,尽管我不排除可能存在涉及使用滞后变量构造第二个变量的其他问题。跨度>
  • @42- 我完全不清楚他们想要做什么,但如果这三个答案都是这样做的,那么我在副本上错了

标签: r multirow


【解决方案1】:

试试这个:

# load package
library(dplyr)
# reproduce your data
df <- data.frame(x = rep(1:2, c(4, 3)),
                 y = c(2, 2, 6, 7, 4, 5, 9))
df %>%
  mutate(z = case_when(x == lag(x) ~ y - lag(x),
                       TRUE ~ 0))

希望对你有帮助

【讨论】:

    【解决方案2】:

    或者在base R中,这可以通过ifelse来完成

    df$z <- c(0, ifelse(diff(df$x) == 0, 1, 0)*(df$y[-1]-df$x[-nrow(df)]))
    #   x y z
    # 1 1 2 0
    # 2 1 2 1
    # 3 1 6 5
    # 4 1 7 6
    # 5 2 4 0
    # 6 2 5 3
    # 7 2 9 7
    

    数据

    df <- structure(list(x = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), y = c(2, 2, 
                                                              6, 7, 4, 5, 9)), class = "data.frame", row.names = c(NA, -7L))
    

    【讨论】:

      【解决方案3】:

      布尔算术与用于构造滞后变量的头部和尾部一起使用。 (第一个实现使用了错误的逻辑):

      dat$new <- with(dat, c(0,  # starting value for no prior x
                         tail(y,-1)-head(x, -1)) * #The values if x[-1]==x
                    # then construct the x[-1] == x logical vector
                           ( c(0,                        # starting
                         tail(x,-1)== head(x,-1)))) # prior x == current x 
      
      > dat
        x y new
      1 1 2   0
      2 1 2   1
      3 1 6   5
      4 1 7   6
      5 2 4   0
      6 2 5   3
      7 2 9   7
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-24
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多