这里讨论了矢量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。
答案 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 = TRUE
和FALSE | 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
。