计算动态列子集的平均值和标准差

3

动态选择一组列并计算其均值和标准差。

以下是一个示例:

sales <- data.frame(ItemID=c("1A","1B","1C"),
           Jul=c(0,1,5),
           Aug=c(1,2,6),
           Sep=c(0,3,7),
           Oct=c(1,4,8),
           Nov=c(1,4,8),
           Dec=c(1,4,8),
           Jan=c(1,4,8),
           Nmon=c(7,4,6))

以上测试数据给出了下面的表格。我需要根据“Nmon”列中的值在每一行上应用函数。
  ItemID Jul Aug Sep Oct Nov Dec Jan Nmon
1     1A   0   1   0   1   1   1   1    7
2     1B   1   2   3   4   4   4   4    4
3     1C   5   6   7   8   8   8   8    6

例如,第一条记录的Nmon值为7。然后我需要计算从七月到一月所有值的平均值和标准差(平均值=0.71,标准差=0.49)。
对于第二条记录,其中Nmon值为4,平均值和标准差应仅针对从十月到一月的月份计算(平均值=4,标准差=0)。
在这种情况下,月数可能会增加或减少,但第一个(项目编号)和最后一个(Nmon)列将保持不变。我有一个大型数据集,并需要一种有效的方法来进行这些计算。

第一条记录的索引为7,这告诉我们需要获取从Jan(假设是最新的月份)到Jul的7个月数据。 - Ashwin
当值为4时,应仅考虑从1月(当前月份)到10月。 - Ashwin
好的,谢谢。我发布了一个解决方案。如果那就是你想要的,请告诉我。 - akrun
2个回答

1
也许这可以帮助您。
 t(apply(sales[-1], 1, function(x) {i1 <- length(x)
        x2 <- x[(i1 -x[i1]):(i1-1)]
       c(mean = mean(x2), sd = sd(x2))}))
 #        mean      sd
 #[1,] 0.7142857 0.48795
 #[2,] 4.0000000 0.00000
 #[3,] 7.5000000 0.83666

1
非常感谢,是的,它起作用了......我已经困扰这个问题有一段时间了。 - Ashwin

1

以下是使用基本R的另一种解决方案:

sales <- data.frame(ItemID=c("1A","1B","1C"),
                    Jul=c(0,1,5),
                    Aug=c(1,2,6),
                    Sep=c(0,3,7),
                    Oct=c(1,4,8),
                    Nov=c(1,4,8),
                    Dec=c(1,4,8),
                    Jan=c(1,4,8),
                    Nmon=c(7,4,6))
my.m.sd <- function(i) {
  n <- sales$Nmon[i]
  x <- unlist(sales[i, seq(to=8, length.out = n)])
  c(m=mean(x), s=sd(x))
}
sapply(1:3, my.m.sd)
# > sapply(1:3, my.m.sd)
#        [,1] [,2]    [,3]
# m 0.7142857    4 7.50000
# s 0.4879500    0 0.83666

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接