mutate_at 只有满足特定条件的变量

mutate_at only vars which satisfy a certain condition

我有以下数据框:

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 等等

我找不到 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])
})