【发布时间】:2017-04-17 01:30:08
【问题描述】:
我有以下数据框:
library(dplyr)
dat <- data_frame(id = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L, 3L,
3L, 5L, 5L, 7L, 7L, 7L, 8L, 8L, 8L, 10L),
wish1 = c(4L, NA, NA, 1L, NA, 1L, NA, NA, NA,
NA, -1L, 8L, NA, 1L, -1L, NA, 4L,
NA, NA, -1L),
wish2 = c(1L, NA, NA, 1L, NA, 1L, NA, NA, NA,
NA, -1L, 1L, NA, 2L, -1L, NA, 2L, NA, NA, 1L),
participate = c(NA, 1L, NA, NA, 1L, NA, NA, 1L, NA, NA, NA,
NA, 1L, NA, 4L, NA, NA, NA, 1L, NA))
我想在每个组中将变量participate 的NAs 替换为同一组中可用的值。如果组内没有值,则NA 可以保留。
我需要类似的东西:
df <- data %>% group_by(id) %>%
mutate(participate = (participate, na.rm = TRUE))
不幸的是,如果没有 sum 之类的功能或任何其他功能,这将无法工作。
【问题讨论】:
-
participate只有 19 长,因此代码不会按原样运行。也就是说,dat %>% group_by(id) %>% mutate(participate = first(na.omit(participate)))之类的东西应该可以工作。 -
@alistaire 我尝试了您的代码并收到此错误
Error in mutate_impl(.data, dots) : Unsupported vector type language。你有什么想法吗? -
@alistaire 我发现如果使用
arrange先将数据框按id和participate排序,就没有必要使用na.omit了。这是代码:dat %>% arrange(id, participate) %>% group_by(id) %>% mutate(participate = first(participate))。这可能是迄今为止最简洁的解决方案。 -
或基础:
dat$participate <- ave(dat$participate, dat$id, FUN = function(x){sort(x)[1]})或 data.table:setDT(dat)[, participate := sort(participate)[1], by = id][] -
我现在更正了代码。感谢您的提示!