在R中合并2列

在R中合并2列,r,merge,R,Merge,我有一个数据集,其中包含我要合并的列,如下所示: library(data.table) DF <- as.data.table(list(ID = c(1,2,3,4,5), Product = c('Y', NA, NA, 'Z', NA), Type = c(NA, 'D', 'G', NA, NA))) DF ID Product Type 1 Y NA 2 NA D 3 NA G 4 Z NA 5

我有一个数据集,其中包含我要合并的列,如下所示:

library(data.table)
DF <- as.data.table(list(ID = c(1,2,3,4,5), Product = c('Y', NA, NA, 'Z', NA), Type = c(NA, 'D', 'G', NA, NA)))

DF
ID   Product Type
1       Y     NA
2       NA    D
3       NA    G
4       Z     NA
5       NA    NA
我的代码是:

  DF[,Category := na.omit(c(Product,Type)), by = ID][,c("Product","Type"):=NULL]
我遇到的问题是,当产品和类型都是NAs时,我希望类别为NA。另外,我不知道我的代码是否有效,因为我的数据集有超过200000行

DF[ , Category := ifelse(is.na(Product), Type, Product)]

#   ID Product Type Category
#1:  1       Y   NA        Y
#2:  2      NA    D        D
#3:  3      NA    G        G
#4:  4       Z   NA        Z
#5:  5      NA   NA       NA
这是假设如果产品和类型都有值,您希望产品在类别中


这是假设如果产品和类型都有值,则您希望产品属于类别

我们可以在两个分配中执行此操作,并避免ifelse,因为分配到位:=更快、更有效

DF[, Category := Product][is.na(Product), Category := Type][]
#      ID Product Type Category
#1:  1       Y   NA        Y
#2:  2      NA    D        D
#3:  3      NA    G        G
#4:  4       Z   NA        Z
#5:  5      NA   NA       NA
或者,如果我们假设产品/类型每行最多只有1个非NA值,则可以使用pmax

DF[, Category := pmax(Product, Type, na.rm = TRUE)][]
#    ID Product Type Category
#1:  1       Y   NA        Y
#2:  2      NA    D        D
#3:  3      NA    G        G
#4:  4       Z   NA        Z
#5:  5      NA   NA       NA
基准
编辑:用基准更新,它清楚地显示了我文章中提到的两种方法都是有效的。

我们可以在两个作业中完成这项工作,并避免使用ifelse,因为作业到位:=更快、更有效

DF[, Category := Product][is.na(Product), Category := Type][]
#      ID Product Type Category
#1:  1       Y   NA        Y
#2:  2      NA    D        D
#3:  3      NA    G        G
#4:  4       Z   NA        Z
#5:  5      NA   NA       NA
或者,如果我们假设产品/类型每行最多只有1个非NA值,则可以使用pmax

DF[, Category := pmax(Product, Type, na.rm = TRUE)][]
#    ID Product Type Category
#1:  1       Y   NA        Y
#2:  2      NA    D        D
#3:  3      NA    G        G
#4:  4       Z   NA        Z
#5:  5      NA   NA       NA
基准
编辑:更新了基准测试,它清楚地显示了我文章中提到的两种方法都是有效的。

dplyr::coalesce就是为了这个目的:librarydplyr;DF%>%mutateCegory=coalesceProduct,Type或with data.table语法,DF[,Category:=coalesceProduct,Type]dplyr::coalesce用于此目的:librarydplyr;DF%>%mutateCategory=coalesceProduct,Type或with data.table grammar,DF[,Category:=coalesceceProduct,Type]感谢您的计时,我没想到ifelse版本会慢那么多。感谢您的计时,我没想到ifelse版本会慢那么多。
DF[, Category := Product][is.na(Product), Category := Type][]
#      ID Product Type Category
#1:  1       Y   NA        Y
#2:  2      NA    D        D
#3:  3      NA    G        G
#4:  4       Z   NA        Z
#5:  5      NA   NA       NA