将子集列粘贴在一起
Pasting together subsetted columns
我想将一些列与一些文本粘贴在一起,只有在至少有一个不是 NA 并且我当前的解决方案有效但很麻烦的情况下才将它们组合在一起。所以我想知道是否有更简洁的方法来执行此操作(创建下面的 "combine" 列)。我想使用 tidyr 但似乎没有办法指定如何处理 unite()
中的缺失值
谢谢,我希望我没有错过任何明显的东西。
df = data.frame(num=c(1,2,NA,NA),place=c("Rome",NA,"Paris",NA))
df$combine[!is.na(df$num)|!is.na(df$place)] =
paste(df$num[!is.na(df$num)|!is.na(df$place)],
"days in",df$place[!is.na(df$num)|!is.na(df$place)])
# df
# num place combine
# 1 1 Rome 1 days in Rome
# 2 2 <NA> 2 days in NA
# 3 NA Paris NA days in Paris
# 4 NA <NA> <NA>
每当您发现自己再次计算相同的东西(此处:索引)时,请尝试存储它并重用该对象以避免冗余计算。对于您的示例,您可以按如下方式计算非 NA 索引:
idx <- rowSums(!is.na(df)) > 0
然后,您可以使用它来将相关行粘贴在一起:
df[idx, "combine"] <- with(df[idx, ], paste(num, "days in", place))
我们可以使用 mutate
和 dplyr
中的 ifelse
library(dplyr)
df %>%
mutate(combine = ifelse(rowSums(!is.na(.))>0, paste(num, "days in", place), NA))
# num place combine
#1 1 Rome 1 days in Rome
#2 2 <NA> 2 days in NA
#3 NA Paris NA days in Paris
#4 NA <NA> <NA>
或使用data.table
library(data.table)
setDT(df)[df[, !Reduce(`&`, lapply(.SD, is.na))], combine := paste(num, "days in", place)]
df
# num place combine
#1: 1 Rome 1 days in Rome
#2: 2 NA 2 days in NA
#3: NA Paris NA days in Paris
#4: NA NA NA
我想将一些列与一些文本粘贴在一起,只有在至少有一个不是 NA 并且我当前的解决方案有效但很麻烦的情况下才将它们组合在一起。所以我想知道是否有更简洁的方法来执行此操作(创建下面的 "combine" 列)。我想使用 tidyr 但似乎没有办法指定如何处理 unite()
中的缺失值谢谢,我希望我没有错过任何明显的东西。
df = data.frame(num=c(1,2,NA,NA),place=c("Rome",NA,"Paris",NA))
df$combine[!is.na(df$num)|!is.na(df$place)] =
paste(df$num[!is.na(df$num)|!is.na(df$place)],
"days in",df$place[!is.na(df$num)|!is.na(df$place)])
# df
# num place combine
# 1 1 Rome 1 days in Rome
# 2 2 <NA> 2 days in NA
# 3 NA Paris NA days in Paris
# 4 NA <NA> <NA>
每当您发现自己再次计算相同的东西(此处:索引)时,请尝试存储它并重用该对象以避免冗余计算。对于您的示例,您可以按如下方式计算非 NA 索引:
idx <- rowSums(!is.na(df)) > 0
然后,您可以使用它来将相关行粘贴在一起:
df[idx, "combine"] <- with(df[idx, ], paste(num, "days in", place))
我们可以使用 mutate
和 dplyr
ifelse
library(dplyr)
df %>%
mutate(combine = ifelse(rowSums(!is.na(.))>0, paste(num, "days in", place), NA))
# num place combine
#1 1 Rome 1 days in Rome
#2 2 <NA> 2 days in NA
#3 NA Paris NA days in Paris
#4 NA <NA> <NA>
或使用data.table
library(data.table)
setDT(df)[df[, !Reduce(`&`, lapply(.SD, is.na))], combine := paste(num, "days in", place)]
df
# num place combine
#1: 1 Rome 1 days in Rome
#2: 2 NA 2 days in NA
#3: NA Paris NA days in Paris
#4: NA NA NA