r - 基于特定条件进行过滤和添加的有效方法(本例中为 3 个条件)

标签 r data.table plyr dplyr subset-sum

我有一个看起来像这样的数据框

     a    b    c   d
     1    1    1   0
     1    1    1   200
     1    1    1   300
     1    1    2   0
     1    1    2   600
     1    2    3   0
     1    2    3   100
     1    2    3   200
     1    3    1   0

我有一个看起来像这样的数据框
     a    b    c   d
     1    1    1   250
     1    1    2   600
     1    2    3   150
     1    3    1   0

我目前正在做
{
  n=nrow(subset(Wallmart, a==i &    b==j & c==k  ))
  sum=subset(Wallmart, a==i &    b==j & c==k  )
  #sum
  sum1=append(sum1,sum(sum$d)/(n-1))

}

我想添加 'd' 列并通过计算行数而不计算 0 来取平均值。例如,第一行是 (200+300)/2 = 250。
目前我正在构建一个存储“d”列的列表,但理想情况下我希望它采用上述格式。例如,第一行看起来像
     a    b    c   d
     1    1    1   250

这是完成这项工作的一种非常低效的方式。代码需要很长时间才能循环运行。
因此,感谢任何帮助使其运行得更快。原始数据框大约有一百万行。

最佳答案

你可以试试 aggregate :

aggregate(d ~ a + b + c, data = df, sum)
#   a b c   d
# 1 1 1 1 500
# 2 1 3 1   0
# 3 1 1 2 600
# 4 1 2 3 300

正如@Roland 所指出的,对于更大的数据集,您可以尝试 data.tabledplyr相反,例如:
library(dplyr)
df %>%
  group_by(a, b, c) %>%
  summarise(
    sum_d = sum(d))

# Source: local data frame [4 x 4]
# Groups: a, b
# 
#   a b c sum_d
# 1 1 1 1   500
# 2 1 1 2   600
# 3 1 2 3   300
# 4 1 3 1     0

编辑 以下更新的问题。
如果你想计算分组平均值,排除零行,你可以试试这个:
aggregate(d ~ a + b + c, data = df, function(x) mean(x[x > 0]))
#   a b c   d
# 1 1 1 1 250
# 2 1 3 1 NaN
# 3 1 1 2 600
# 4 1 2 3 150

df %>%
  filter(d != 0) %>%
  group_by(a, b, c) %>%
  summarise(
    mean_d = mean(d))

#   a b c mean_d
# 1 1 1 1    250
# 2 1 1 2    600
# 3 1 2 3    150

但是,因为您似乎希望将零视为缺失值而不是数字零,所以我认为最好将它们转换为 NA在准备数据集时,在计算之前。
df$d[df$d == 0] <- NA
df %>%
  group_by(a, b, c) %>%
  summarise(
    mean_d = mean(d, na.rm = TRUE))

#   a b c mean_d
# 1 1 1 1    250
# 2 1 1 2    600
# 3 1 2 3    150
# 4 1 3 1    NaN

关于r - 基于特定条件进行过滤和添加的有效方法(本例中为 3 个条件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23321300/

相关文章:

R - 如何基于多个因素在不同的 data.table 列上运行平均值和最大值并返回原始列名

r - cbind 与部分嵌套列表

r - 将 Google 财经股票数据中的时间戳转换为正确的日期时间

r - 有什么方法可以进行过滤以及在ddply中进行汇总?

r - 列出 lm 对象,保留它们的类

r - R 中 ddply 的小计

r - 如何更改 x 轴刻度以反射(reflect)另一个变量?

R:使用cv.glm计算弹性网预测误差

r - 如何运行控制 R 中多个变量的多重 t 检验或方差分析?

r - igraph R 中的边缘中心性度量