【问题标题】:Pasting together subsetted columns将子集列粘贴在一起
【发布时间】:2017-01-01 17:38:41
【问题描述】:

我想将一些列与一些文本粘贴在一起,只有当至少一个不是 NA 并且我当前的解决方案有效但很麻烦时,它们才会组合在一起。所以我想知道是否有一种更简洁的方法来做到这一点(在下面创建“组合”列)。我想使用 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>

【问题讨论】:

  • 合并列听起来像是 cbind() 的工作。
  • 为什么需要所有值都是 NA 的行?你不能只删除所有 NA 的行,然后只删除 paste 其余的行吗?
  • “2 days in NA”或“NA days in Paris”作为输出有意义吗?

标签: r dataframe subset tidyr


【解决方案1】:

每当您发现自己再次计算相同的东西(这里:索引)时,请尝试存储它并重用该对象以避免冗余计算。对于您的示例,您可以按如下方式计算非 NA 索引:

idx <- rowSums(!is.na(df)) > 0

然后,您可以使用它将相关行粘贴在一起:

df[idx, "combine"] <- with(df[idx, ], paste(num, "days in", place))

【讨论】:

  • 如果原始数据中的列多于这两列,请将第一行更改为idx &lt;- rowSums(!is.na(df[, c("num", "place")])) &gt; 0
【解决方案2】:

我们可以使用mutateifelse 来自dplyr

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

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 2022-01-18
    • 2010-11-17
    • 2011-03-20
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多