R条件变量
我想为每个“站点”计算一个新变量(mean.BC),条件为x=BC5、BC6、BC7。换言之,取平均值(19,70,84)并超过所有具有站点“a”的行的结果,然后对所有具有站点“b、c等”的行执行相同的操作,但BC5、BC6、BC7的“y”值除外 每个站点都会发生变化 这可能不是最好的方法,我确实尝试过使用tidyr::spread()来传播数据,使用“x”作为键,但id没有 对我来说没有任何意义 test.data%%>%as.tibble()%%>%group\u by(site)%%>%mutate(meanBC=if\u else(test.data$x==:找不到函数“%%>%” 期望的结果应该如下所示:R条件变量,r,R,我想为每个“站点”计算一个新变量(mean.BC),条件为x=BC5、BC6、BC7。换言之,取平均值(19,70,84)并超过所有具有站点“a”的行的结果,然后对所有具有站点“b、c等”的行执行相同的操作,但BC5、BC6、BC7的“y”值除外 每个站点都会发生变化 这可能不是最好的方法,我确实尝试过使用tidyr::spread()来传播数据,使用“x”作为键,但id没有 对我来说没有任何意义 test.data%%>%as.tibble()%%>%group\u by(site)%%>%m
site rep.x..2. y meanBC
# 1 a A1 34 57.6
# 2 a B2 45 57.6
# 3 a C3 11 57.6
# 4 a D4 10 57.6
# 5 a BC5 19 57.6
# 6 a BC6 70 57.6
使用
dplyr
,我们可以按站点分组,计算y
的平均值,其对应的x
是c(“BC5”、“BC6”、“BC7”)中的一个
在base R
中,我们可以
test.data$mean.BC <- with(test.data, ave(y * NA^!(x %in% c("BC5", "BC6","BC7")),
site, FUN = function(x) mean(x, na.rm = TRUE)))
test.data$mean.BC
#[1] 57.66667 57.66667 57.66667 57.66667 57.66667 57.66667 57.66667
#[8] 37.66667 37.66667 37.66667 37.66667 37.66667 37.66667 37.66667
test.data$mean.BC我了解你发布的代码中的所有内容,除了…y*NA^!…@akrun你能告诉我这是做什么的吗?@carlineo它是用逻辑表达式创建NA
。例如NA^(c(真,假))
返回NA
表示真,1表示假。当你否定时(!
),所有0值都变为TRUE
,其他值变为FALSE。因此,我们得到0和其他值1的NA
,当与总和相乘时,返回预期值
library(data.table)
setDT(test.data)[, mean.BC := mean(y[x %in% c("BC5", "BC6","BC7")]), by = site]
test.data$mean.BC <- with(test.data, ave(y * NA^!(x %in% c("BC5", "BC6","BC7")),
site, FUN = function(x) mean(x, na.rm = TRUE)))
test.data$mean.BC
#[1] 57.66667 57.66667 57.66667 57.66667 57.66667 57.66667 57.66667
#[8] 37.66667 37.66667 37.66667 37.66667 37.66667 37.66667 37.66667