【问题标题】:Count number of occurrences for every n row in R [duplicate]计算R中每n行的出现次数[重复]
【发布时间】:2017-03-26 15:05:18
【问题描述】:

我有一个包含a 列的数据框:

x = data.frame(
    "a" = c(F, F, F, T,
            F, T, T, F,
            T, T, F)
)

我想知道每个例如4 行 a 的频率是 T 并将此值应用于新列 b,因此对于前 4 行 T 的频率是 1/4,对于接下来的 4 行T 的频率是 2/4,其余 3 行 T 的频率是 2/3:

x$b = c(0.25,0,25,0.25,0.25
        0.5,0.5,0.5,0.5,
        0.66,0.66,0.66)

我可以通过使用tapply 获得列a 的频率,但这给了我一个列表而不是向量。

如果不使用外部库,我将不胜感激。

【问题讨论】:

  • 如果您已经知道如何使用 tapply 实现预期输出,为什么不直接将列表转换为向量?

标签: r


【解决方案1】:

一个选项是ave 来自base R。用gl创建一个分组变量,ave的默认函数是mean,它取逻辑列'a'的平均值得到输出

x$b <- with(x, ave(a, as.integer(gl(nrow(x), 4, nrow(x)))))
x$b
#[1] 0.2500000 0.2500000 0.2500000 0.2500000 0.5000000 0.5000000 
#[7] 0.5000000 0.5000000 0.6666667 0.6666667 0.6666667

或者在data.table中使用相同的方法

library(data.table)
setDT(x)[, b := mean(a), .(grp= as.integer(gl(nrow(x), 4, nrow(x))))]
x
#    a         b
# 1: FALSE 0.2500000
# 2: FALSE 0.2500000
# 3: FALSE 0.2500000
# 4:  TRUE 0.2500000
# 5: FALSE 0.5000000
# 6:  TRUE 0.5000000
# 7:  TRUE 0.5000000
# 8: FALSE 0.5000000
# 9:  TRUE 0.6666667
#10:  TRUE 0.6666667
#11: FALSE 0.6666667

或者dplyr

library(dplyr)
x %>%
  group_by(grp = as.integer(gl(nrow(x), 4, nrow(x)))) %>%
  mutate(b = mean(a)) %>%
  ungroup() %>%
  select(-grp)

【讨论】:

    【解决方案2】:

    我们可以使用基础 R ave。我们可以创建一个由每个n 元素组成的组,并找到每个组的 TRUE 元素数与总元素数之比。

    n <- 4
    x$b <- ave(x$a, rep(seq(1, nrow(x)), each = n, length.out = nrow(x)), 
                                          FUN = function(x) sum(x)/length(x))
    x
    #     a         b
    #1  FALSE 0.2500000
    #2  FALSE 0.2500000
    #3  FALSE 0.2500000
    #4   TRUE 0.2500000
    #5  FALSE 0.5000000
    #6   TRUE 0.5000000
    #7   TRUE 0.5000000
    #8  FALSE 0.5000000
    #9   TRUE 0.6666667
    #10  TRUE 0.6666667
    #11 FALSE 0.6666667
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多