【问题标题】:Why does median and coalesce not work with uneven number of rows?为什么中位数和合并不适用于奇数行?
【发布时间】:2020-03-06 14:55:32
【问题描述】:

recent question 中,我尝试使用dplyr::coalesceNA 替换为分组中位数来给出答案。但我有一个

Error: Argument 2 must be an integer vector, not a double vector

错误。试图弄清楚这是什么原因,我终于指出它看起来像只有当nrow(df)是一个非偶数时才会出现错误?我有点怀疑这是否真的是解释,但那是我决定在这里提出问题的那一刻:这是什么原因?我发现的唯一相关问题是here,但我不确定这是否是同一个问题?

编辑:

如果我将median 替换为minmax,则不会引发错误!

MRE:

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()

加注:

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

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

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

它有效....!!?

附言
使用 ifelse(is.na(.)... 而不是 coalesce 也可以独立于行数:

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

P.P.S 使用mean 而不是median 时也会引发错误

【问题讨论】:

  • 也许这与median 文档有关:“默认方法返回与 x 相同类型的长度为一的对象,除非 x 是逻辑或偶数长度的整数,当结果将是双倍的。”

标签: r dplyr


【解决方案1】:

median 文档说

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

如果 df$ID 设置为 as.numeric,则不会抛出您看到的错误。暗示coalescedf$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()

还要注意 ID 的 class 会如何根据输入方式的不同而变化:

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)

【讨论】:

  • 谢谢你,xilliam。这解释了对元素数量的奇怪依赖!我真的应该更仔细地阅读?median!谢谢你帮助我;)
  • 我赞扬你敏锐的眼睛发现依赖;)
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2018-06-14
  • 2011-05-22
  • 2021-11-13
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
相关资源
最近更新 更多