【问题标题】:dplyr - filling with unique valuedplyr - 填充独特的价值
【发布时间】:2019-11-15 01:52:46
【问题描述】:

一个非常基本的问题,但我想知道在组标识符定义唯一值和/或缺失的数据集中,使用 dplyr 的唯一值会如何缺失?如果它是一个数字列,我会这样做:

data %>% 
  group_by(groupIDs) %>% 
  mutate(VARwithNA=max(VARwithNA, na.rm=TRUE)

但是如果它是一个字符列呢?有一个更好的方法吗?谢谢!

【问题讨论】:

  • 或许mutate(VARwithNA = toString(unique(VARwithNA[!is.na(VARwithNA)])))
  • mutate(VARwithNA = unique(na.omit(VARwithNA))) 应该适用于大多数类型的数据:数字、字符、日期、时间等。
  • 谢谢你!如果您想将其写为答案,我很乐意接受它

标签: r dplyr


【解决方案1】:

unique 值的长度可能与每个组的行数不匹配。使用可重现的示例

data(mtcars)
mtcars$carb[c(5, 6, 10, 31)] <- NA
mtcars %>% 
   group_by(am) %>%
   mutate(carb = unique(carb[!is.na(carb)]))

错误:列 carb 的长度必须为 19(组大小)或 1,而不是 4


在这种情况下,最好将它们粘贴为单个字符串

library(dplyr)
data %>% 
   group_by(groupIDs) %>% 
   mutate(VARwithNA = toString(unique(VARwithNA[!is.na(VARwithNA)])))

或保留为list

data %>% 
   group_by(groupIDs) %>% 
   mutate(VARwithNA = list(unique(VARwithNA[!is.na(VARwithNA)])))

【讨论】:

    【解决方案2】:

    使用unique 将提取(唯一的)唯一值并保留其类型。以下解决方案的优点是它应该适用于大多数数据类型(数字、字符、逻辑、日期、时间等)。

    data %>% 
      group_by(groupIDs) %>% 
      mutate(VARwithNA=unique(na.omit(VARwithNA)))
    

    请注意,如果没有可用(即非 NA)值,这将失败并显示“替换长度为 0”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2023-03-22
      相关资源
      最近更新 更多