【问题标题】:Paste multiple data.table columns into single column based on unique values根据唯一值将多个 data.table 列粘贴到单个列中
【发布时间】:2020-06-07 14:32:51
【问题描述】:

我有一个如下所示的 data.table:

require("data.table")

dt1 <- data.table(VAR1 = c("Brick","Sand","Concrete","Stone"), VAR2 = c(100,23,76,43), VAR3 = c("Place","Location","Place","Vista"), VAR4 = c("Place","Tree","Wood","Vista"), VAR5 = c("Place","Tree","Wood","Forest"))

我想按以下顺序将命名列(我的真实数据有其他列)粘贴在一起:VAR2、VAR1、VAR3、VAR4 和 VAR5。但是,我有两个条件:

  • 不应重复同一行中的值(当值重复时,应保留最后一个条目的列 - 因此在我的示例中,VAR5 中的“位置”将是保留的那个)
  • 粘贴时逗号应该是分隔符,VAR2 和 VAR1 之间除外

我的预期输出如下所示:

dt2 <- data.table(VAR6 = c("100 Brick, Place","23 Sand, Location, Tree","76 Concrete, Place, Wood","43 Stone, Vista, Forest"))

【问题讨论】:

    标签: r string data.table paste


    【解决方案1】:

    我们可以在.SDcols中按顺序选择列后使用do.call(paste,用正则表达式去除重复的单词

    dt1[,  .(VAR6 = sub(",", " ", gsub("\\b(\\w+)\\b\\s*,\\s*(?=.*\\1)", "", 
          do.call(paste, c(.SD, sep=",")), perl = TRUE))), 
               .SDcols = names(dt1)[c(2:1, 3:5)]]
    #                     VAR6
    #1:        100 Brick,Place
    #2:  23 Sand,Location,Tree
    #3: 76 Concrete,Place,Wood
    #4:  43 Stone,Vista,Forest
    

    或按行序列分组并执行paste

    V6 <- dt1[, sprintf("%s %s, %s", VAR2, VAR1, 
       toString(unique(unlist(.SD)))), 1:nrow(dt1), .SDcols = VAR3:VAR5]$V1
    data.table(V6)
    #                     V6
    #1:         100 Brick, Place
    #2:  23 Sand, Location, Tree
    #3: 76 Concrete, Place, Wood
    #4:  43 Stone, Vista, Forest
    

    【讨论】:

    • 修改了您的答案,因此我将 VAR6 添加到现有 dt1:dt1[,VAR6 := dt1[, sprintf("%s %s, %s", VAR2, VAR1, toString(unique(unlist( .SD)))), 1:nrow(dt1), .SDcols = VAR3:VAR5]$V1]
    • 如果我想用逗号分隔所有列(包括 VAR2 和 VAR1),需要更改什么?
    • @Chris 在这种情况下,您只需要删除sub(",", " ", 和关闭)
    猜你喜欢
    • 2013-08-23
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多