R条件变量

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

我想为每个“站点”计算一个新变量(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==:找不到函数“%%>%” 期望的结果应该如下所示:

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