我有以下数据框:
db <- structure(list(x = c(0, 1, 2, 4, 0, 3, 5, 8), y = c(0, 0, 3,
4, 8, 9, 1, 5), z = c(3, 2, 0, 1, 4, 6, 9, 8)), row.names = c(NA,
-8L), class = c("tbl_df", "tbl", "data.frame"))
我想创建一个列,该列的所有其他列的平均值均大于0 (每次均设置为不同的值。
我尝试了以下方法:
db %>% mutate_at(vars(.)>0, rowMeans(.))
我在做什么错了?
最后一列的输出应为3、1.5、2.5等。
答案 0 :(得分:1)
除了dplyr
之外,我找不到任何好的选择,除了使用此技巧将所有负值或零值替换为NA(均值计算中未包括):
db %>%
mutate_all(~ifelse(.>0,.,NA_integer_)) %>%
mutate(
positivemean = rowMeans(., na.rm=TRUE)
)
请注意,当您丢失这些值的值时,此技巧具有破坏性。
尽管没有dplyr
,您可以在行上使用apply
循环来获得预期的输出:
db$positivemean = db %>% select(x,y,z) %>% apply(1, function(line){
mean(line[line>0])
})