【问题标题】:Summarise across rows by making reference to row numbers in R通过引用 R 中的行号跨行汇总
【发布时间】:2021-02-26 10:23:37
【问题描述】:

亲爱的数据操作向导,

我正在尝试以引用行号的方式总结我的数据框,但我找不到以整洁的方式完成它的方法。我的数据框看起来像这样。

# Sample data frame.
df <- data.frame(value = c(1,2,1,1,2,4,5,3,2))

  value
1     1
2     2
3     1
4     1
5     2
6     4
7     5
8     3
9     2

我需要创建一个列,如果value中的对应数字以及接下来连续4行中的数字都大于或等于2,则显示TRUE。结果数据框应如下所示:

  value largerThan
1     1      FALSE
2     2      FALSE
3     1      FALSE
4     1      FALSE
5     2       TRUE
6     4         NA
7     5         NA
8     3         NA
9     2         NA

注意largerThan 的最后四行中的四个NA。这是因为这些行后面没有 4 个连续的行,因此无法评估它们。这是什么 绊倒我,以及在使用tidyverse 语法时我不知道如何引用行号这一事实。 for loops 更直接,但我想不出等价物。

非常感谢您的建议!特别是如果您有 tidyverse 或 dplyr 解决方案,因为这些是其余代码中使用的包。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    这样做

    df$largerthan <- zoo::rollsum(df$value >= 2, 5, na.pad = T, align = "left") >=5
    
      value largerthan
    1     1      FALSE
    2     2      FALSE
    3     1      FALSE
    4     1      FALSE
    5     2       TRUE
    6     4         NA
    7     5         NA
    8     3         NA
    9     2         NA
    

    按照逻辑,baseR方式

    df$largerthan <- rowSums(cbind(df >=2, c(df[-1,], NA) >=2, c(df[-c(1:2), ], NA, NA) >=2, c(df[-c(1:3),], NA, NA, NA) >=2, c(df[-c(1:4),], NA, NA, NA, NA)>=2)) >=5
    

    如果你想在 dplyr 中这样做

    df %>% mutate(largerThan = (value >=2 & lead(value) >=2 & lead(value,2) >= 2 & lead(value, 3) >= 2 & lead(value,4) >= 2))
    

    【讨论】:

    • 谢谢!我不知道“rollsum”。我会等着看是否有人有不需要安装新软件包的替代方案,但这已经很有帮助。非常感谢!
    • 要在基础 R 中执行此操作,请参阅此 answer
    【解决方案2】:

    抱歉,对 tidyverse 不够熟悉。这是一个可能的 data.table 解决方案。也许你可以把它翻译成 tidyverse

    library( data.table )
    setDT(df)
    df[, largerThan := frollsum( value >= 2, n = 5, align = "left" ) > 4 ]
    #    value largerThan
    # 1:     1      FALSE
    # 2:     2      FALSE
    # 3:     1      FALSE
    # 4:     1      FALSE
    # 5:     2       TRUE
    # 6:     4         NA
    # 7:     5         NA
    # 8:     3         NA
    # 9:     2         NA
    

    【讨论】:

    • 谢谢!如果有 tidyverse 等价物,我会尝试解决。如果它有像​​这样优雅的东西,那就太好了:)
    【解决方案3】:

    这是一个dpylr 版本,但是它不如使用rollsums 的其他解决方案优雅。 dpylr 具有函数lead() 和lag()。解决方案如下所示:

    df <- data.frame(value = c(1,2,1,1,2,4,5,3,2))
    df = df %>% mutate(
      largerThan = value >= 2 & lead(value) >= 2 & lead(value, 2) >= 2 &
        lead(value, 3) >= 2 & lead(value, 4) >= 2
    )
    

    您需要的潜在客户越多,使用替代解决方案就越容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      相关资源
      最近更新 更多