在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