在R中为每n行计算出现次数。

55 浏览
0 Comments

在R中为每n行计算出现次数。

我有一个带有列a的数据框:\n

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

\n我想知道每4行中aT的频率,并将该值应用到一个新的列b中,所以对于前4行,T的频率为1/4,对于接下来的4行,T的频率为2/4,对于剩余的3行,T的频率为2/3:\n

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)

\n我可以使用tapply来获得列a的频率,但这给我一个列表而不是向量作为结果。\n我希望不使用外部库来提供答案。

0
0 Comments

问题的出现原因是需要统计在R中每n行出现的次数。解决方法是使用基本的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

以上代码将在数据框x的列a中创建一个新的列b,并计算每4行的TRUE元素的比例,并将结果存储在列b中。最后,数据框x将包含原始数据和每4行的比例结果。

0
0 Comments

问题的出现原因:这个问题的出现是因为需要统计R中每n行出现的次数。

解决方法:有几种解决方法可以实现这个目标。一种方法是使用基本R中的ave函数。通过使用gl函数创建一个分组变量,ave函数的默认函数是mean,它可以计算逻辑列'a'的平均值来得到输出。另一种方法是使用data.table包,使用相同的方法,在数据表x中使用setDT函数将数据框转换为数据表,然后使用[.data.table函数通过组合变量grp计算a的平均值,并将结果存储在列b中。最后一种方法是使用dplyr包,通过使用group_by函数和mutate函数来计算每个组中a的平均值,并使用select函数选择需要的列。

下面是完整的代码:

# 使用ave函数
x$b <- with(x, ave(a, as.integer(gl(nrow(x), 4, nrow(x)))))
x$b
# 使用data.table包
library(data.table)
setDT(x)[, b := mean(a), .(grp= as.integer(gl(nrow(x), 4, nrow(x))))]
x
# 使用dplyr包
library(dplyr)
x %>%
  group_by(grp = as.integer(gl(nrow(x), 4, nrow(x)))) %>%
  mutate(b = mean(a)) %>%
  ungroup() %>%
  select(-grp)

以上是三种不同的方法来统计R中每n行出现的次数。每种方法都有其自己的优势和适用场景,具体使用哪种方法取决于个人的需求和偏好。

0