【发布时间】:2019-09-07 02:38:18
【问题描述】:
我正在尝试根据 group_by 的大小将列中的 0 值替换为大型数据集的组的中值。
set.seed(10000)
Data <- data.frame(
X = as.numeric(c(0,2,3,4,5,6,7,8,9,0)),
Y = c("no","yes","yes","yes","yes","yes","yes","yes","yes","yes"),
Z = c(F,T,T,T,T,F,F,F,T,T)
)
# change 0 in the 10 spot to median
Data <- Data %>%
# group by Y and Z then
group_by(Y,Z) %>%
# if the size of the group is less than 2 and if X is NA change it to 10
# else leave it as X else (if group size 2 or greater) leave value as NA then
mutate(X = ifelse(n()<2,ifelse(X==0,median(X),X),X))
# change 0 in 1 spot to median
Data <- Data %>%
# group by Y then
group_by(Y) %>%
# if the size of the group is larger than 2 and if X is NA change it to 1
# else leave is as X else(if group size 3 or larger) leave value as X
mutate(X = ifelse(n()<3,ifelse(X==0,median(X),X),X))
导致错误:
n > 1 中的错误:
比较 (6) 仅适用于原子和列表类型
我希望 X 列是上述代码之后 1:10 的序列。
这是我在使用大型数据集时遇到的问题的概括,我试图将 0 值作为不同组的中位数,以组的大小为条件,我得到与上述相同的错误。
【问题讨论】:
-
我认为您希望
n()在您的 ifs 中并且不确定条件,因为您的第一个 mutate 用 NA 填充X列,最后是 10,因为 yes 组有长度9. -
我不听你的问题。在您声明的代码上方:“我正在尝试根据 group_by 的大小有条件地将列中的 NA 值替换为中值”。然而,在您不使用任何中间值的代码中,您需要一些固定值(1 和 10)。你想要/期待哪一个?
-
我也不清楚您要做什么。您能否为您提供的示例数据提供您的预期输出?此外,不需要
set.seed,因为您不会生成随机数据。
标签: r if-statement group-by dplyr