【发布时间】:2019-03-13 17:19:57
【问题描述】:
在将几列与 tidyr::unite() 组合后,来自缺失数据的 NA 仍保留在我的字符向量中,这是我不想要的。
我每行(每列 1 个)有一系列医疗诊断,并希望对一系列代码进行基准搜索通过。%in% 和 grepl()。
Github 上有一个关于这个问题的未解决问题,是否有任何动作或解决方法?我想保持向量用逗号分隔。
这是一个有代表性的例子:
library(dplyr)
library(tidyr)
df <- data_frame(a = paste0("A.", rep(1, 3)), b = " ", c = c("C.1", "C.3", " "), d = "D.4", e = "E.5")
cols <- letters[2:4]
df[, cols] <- gsub(" ", NA_character_, as.matrix(df[, cols]))
tidyr::unite(df, new, cols, sep = ",")
当前输出:
# # A tibble: 3 x 3
# a new e
# <chr> <chr> <chr>
# 1 A.1 NA,C.1,D.4 E.5
# 2 A.1 NA,C.3,D.4 E.5
# 3 A.1 NA,NA,D.4 E.5
期望的输出:
# # A tibble: 3 x 3
# a new e
# <chr> <chr> <chr>
# 1 A.1 C.1,D.4 E.5
# 2 A.1 C.3,D.4 E.5
# 3 A.1 D.4 E.5
【问题讨论】:
-
如果您使用的是
dplyr/tidyr,请使用“整洁”的长格式数据。跨行中的列进行诊断是一场等待发生的噩梦。将其拆分为一个单独的诊断表,其中一列用于事件标识符,一列用于在页面下方运行的诊断(2 列数据集)。然后,您可以使用像%in%这样的简单代码对 single 列进行操作,避免 NA 值混乱(因为不会有任何值!)。您在诊断级别创建的任何标志都可以使用group_by/summarise等回滚到情节级别。 -
@thelatemail 优秀建议的代码方法:
df %>% rowid_to_column('id') %>% gather(key, value, cols) %>% drop_na(value) %>% group_by(a, e, id) %>% summarise(x = paste(value, collapse = ',')) %>% ungroup() %>% select(-id)