用R计算data.table中不同列的均值的条件

时间:2014-06-19 00:08:03

标签: r list aggregate data.table

这里讨论了矢量t的均值和中位数的计算问题,对于矢量y的每个值(从1到4),其中x = 1,z = 1,使用R中的聚合函数。

 x y z  t
 1 1 1 10
 1 0 1 15
 2 NA 1 14
 2 3 0 15
 2 2 1 17
 2 1 NA 19
 3 4 2 18
 3 0 2 NA
 3 2 2 45
 4 3 2 NA
 4 1 3 59
 5 0 3 0
 5 4 3 45
 5 4 4 74
 5 1 4 86

Multiple aggregation in R with 4 parameters

但是我怎样才能对每个矢量x的值(从1到5)计算(mean(y)+ mean(z))/(mean(z)-mean(t))?并且不要在任何向量中计算值0和NA。例如,在向量y中,第3个值为0,因此不应使用每个向量(y,z,t)中的第3个数字。结果第三行(x = 3)应为NA。

这是计算y,z和t均值的代码,需要添加计算公式(mean(y)+ mean(z))/(mean(z)-mean(t)) :

data <- data.table(dataframe)
bar <- data[,.N,by=x]
foo <- data[ ,list(mean.y  =mean(y, na.rm = T),
                   mean.z=mean(z, na.rm = T),
                   mean.t=mean(t,na.rm = T)),
             by=x]     

在这个计算代码中意味着使用所有行,但是用于计算(mean(y)+ mean(z))/(mean(z)-mean(t)),y或z或t等于的任何行不应使用零或NA。

2 个答案:

答案 0 :(得分:4)

更新

哦,这可以进一步简化,因为data.table默认情况下没有NA子集(特别是考虑到这种情况,类似于base::subset)。所以,你只需要这样做:

dt[y != 0 & z != 0 & t != 0, 
    list(ans = (mean(y) + mean(z))/(mean(z) - mean(t))), by = x]

FWIW,我在data.table中的表现如何:

dt[(y | NA) & (z | NA) & (t | NA), 
        list(ans=(mean(y)+mean(z))/(mean(z)-mean(t))), by=x]
#    x         ans
# 1: 1 -0.22222222
# 2: 2 -0.18750000
# 3: 3 -0.16949153
# 4: 4 -0.07142857
# 5: 5 -0.10309278

让我们使用一般语法对其进行细分:dt[i, j, by]

i中,我们会使用一个不错的小骇客TRUE | NA = TRUEFALSE | NA = NA以及NA | NA = NA来过滤您的条件(您可以在R会话中测试这些内容)。

由于您说您只需要非零非NA值,因此只需| NA每列by - 只返回TRUE为了你的条件。这通过条件部分来确定子集。

然后,对于aggregate中的每个群组,我们j根据您的功能{{1}},以获得结果。

HTH

答案 1 :(得分:1)

这是一个解决方案:

# create your sample data frame
df <- read.table(text = " x y z  t
 1 1 1 10
 1 0 1 15
 2 NA 1 14
 2 3 0 15
 2 2 1 17
 2 1 NA 19
 3 4 2 18
 3 0 2 NA
 3 2 2 45
 4 3 2 NA
 4 1 3 59
 5 0 3 0
 5 4 3 45
 5 4 4 74
 5 1 4 86", header = TRUE)

library('dplyr')

dfmeans <- df %>%
  filter(!is.na(y) & !is.na(z) & !is.na(t)) %>% # remove rows with NAs
  filter(y != 0 & z != 0 & t != 0) %>% # remove rows with zeroes
  group_by(x) %>%
  summarize(xmeans = (mean(y) + mean(z)) / (mean(z) - mean(t)))

我确定有一种更简单的方法可以删除带有NAs和零的行,但它并没有找到我。无论如何,dfmeans看起来像这样:

#   x      xmeans
# 1 1 -0.22222222
# 2 2 -0.18750000
# 3 3 -0.16949153
# 4 4 -0.07142857
# 5 5 -0.10309278

如果你只想要xmeans的值使用dfmeans$xmeans