我有以下示例数据集:
ID = c(123,123)
NAmer = c("ABC","ABC")
field1 = c(1,NA)
field2 = c(NA,2)
field3 = c(NA,NA)
field4 = c(NA,NA)
field5 = c(NA,NA)
IHave <- data.frame(ID,NAmer,field1,field2,field3,field4,field5)
Iwant <- c(123,"ABC",1,2,NA,NA,NA)
如何使用IHave
或Iwant
从data.table
到tidyverse
?
在实践中,我大约有000行。
答案 0 :(得分:3)
根据示例,按“ ID”,“ NAmer”分组后,如果存在至少一个非NA元素,则仅保留非NA元素
library(dplyr)
IHave %>%
group_by(ID, NAmer) %>%
summarise_all(list(~ if(all(is.na(.))) NA else .[!is.na(.)]))
# A tibble: 1 x 7
# Groups: ID [1]
# ID NAmer field1 field2 field3 field4 field5
# <dbl> <fct> <dbl> <dbl> <lgl> <lgl> <lgl>
#1 123 ABC 1 2 NA NA NA
或使用分组方式coalesce
IHave %>%
group_by(ID, NAmer) %>%
summarise_all(list(~ coalesce(!!! .)))
# A tibble: 1 x 7
# Groups: ID [1]
# ID NAmer field1 field2 field3 field4 field5
# <dbl> <fct> <dbl> <dbl> <lgl> <lgl> <lgl>
#1 123 ABC 1 2 NA NA NA
或者data.table
library(data.table)
setDT(IHave)[, lapply(.SD, function(x) coalesce(!!! x)), .(ID, NAmer)]
# ID NAmer field1 field2 field3 field4 field5
#1: 123 ABC 1 2 NA NA NA
答案 1 :(得分:3)
您可以map
遍历各列,reduce
使用coalesce
函数对每一列进行记录。使用函数map_dfc
代替map
,以便将它们c绑定在一起作为数据帧(df)。所以第一列是reduce(IHave[[1]], coalesce)
,等等。
library(tidyverse)
map_dfc(IHave, reduce, coalesce)
# # A tibble: 1 x 7
# ID NAmer field1 field2 field3 field4 field5
# <dbl> <fct> <dbl> <dbl> <lgl> <lgl> <lgl>
# 1 123 ABC 1 2 NA NA NA
如果您要分别为每个ID, NAmer
组执行此操作,则可以改用下面的代码。
IHave %>%
group_by(ID, NAmer) %>%
summarise_all(reduce, coalesce)
答案 2 :(得分:2)
您可以转置数据并使用coalesce
中的dplyr
do.call(dplyr::coalesce, as.data.frame(t(IHave), stringsAsFactors = FALSE))
# [1] "123" "ABC" " 1" " 2" NA NA NA
结果是一个字符向量。