2

我有以下数据框:

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

4

1 回答 1

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])
})
于 2019-12-30T10:20:14.690 回答