为什么中位数和合并对于奇数行数不起作用?

dar*_*rio 5 r dplyr

在最近的一个问题中,我尝试使用分组中位数dplyr::coalesce替换来给出答案。NA但我得到了一个

Error: Argument 2 must be an integer vector, not a double vector
Run Code Online (Sandbox Code Playgroud)

错误。试图找出造成这种情况的原因是什么,我终于指出了只有nrow(df)在非偶数时才会出现错误的地方?我有点怀疑这是否真的是解释,但那就是我决定在这里问问题的那一刻:这是什么原因?我发现的唯一相关问题是here,但我不确定这是否是同一个问题?

编辑:

如果我替换为or ,则不会引发错误!medianminmax

再次:

library(dplyr)
df <- data.frame(ID = 1:7,
                 Group = c(1, 1, 1, 2, 2, 2, 1),
                 val1 = c(1, NA, 3, 2, 2, 3, 2),
                 val2 = c(2, 2, 2, NA, 1, 3, 2))

df %>%
  group_by(Group) %>% 
  mutate_at(vars(-group_cols()), ~coalesce(., median(.,na.rm=TRUE))) %>% 
  ungroup()
Run Code Online (Sandbox Code Playgroud)

加薪:

错误:参数 2 必须是整数向量,而不是双精度向量

但是如果我删除最后一行(或最后三行):

df[1:6, ] %>%
  group_by(Group) %>% 
  mutate_at(vars(-group_cols()), ~coalesce(., median(.,na.rm=TRUE))) %>% 
  ungroup()
Run Code Online (Sandbox Code Playgroud)

有用....!!?

PS
使用ifelse(is.na(.)...而不是合并也可以独立于行数:

df %>%
group_by(Group) %>% 
mutate_at(vars(-group_cols()), ~ifelse(is.na(.), median(., na.rm = TRUE), .)) %>% 
ungroup()
Run Code Online (Sandbox Code Playgroud)

meanPPS 当使用而不是时也会引发错误median

xil*_*iam 3

文档median

默认方法返回与 x 类型相同的长度为 1 的对象,除非 x 是逻辑或偶数长度的整数,否则结果将为 double。”

如果 df$ID 设置为 ,则不会引发您看到的错误as.numeric。建议coalesce让班级感到困惑df$ID

library(dplyr)
df <- data.frame(ID = 1:7,
  Group = c(1, 1, 1, 2, 2, 2, 1),
  val1 = c(1, NA, 3, 2, 2, 3, 2),
  val2 = c(2, 2, 2, NA, 1, 3, 2))

# convert ID to numeric
df$ID <- as.numeric(df$ID)

df %>%
  group_by(Group) %>% 
  mutate_at(vars(-group_cols()), ~coalesce(., median(.,na.rm=TRUE))) %>% 
  ungroup()
Run Code Online (Sandbox Code Playgroud)

另请注意classID 的值如何根据输入方式而变化:

IDa = 1:7
class(IDa)

IDb = c(1,2,3,4,5,6,7)
class(IDb)

IDc = c(1L,2L,3L,4L,5L,6L,7L)
class(IDc)
Run Code Online (Sandbox Code Playgroud)