mutate_at仅满足特定条件的var

时间:2019-12-29 15:22:37

标签: dplyr rowwise

我有以下数据框:

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

1 个答案:

答案 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])
})