【问题标题】:Paste multiple column values with column name使用列名粘贴多个列值
【发布时间】:2014-09-15 16:56:16
【问题描述】:

考虑一下data.table

 dt <- data.table(V1=c(3,2),V2=c(4,2),V3=c(6,5),V4=c(7,8),V5=c(9,10))
 > dt
    V1 V2 V3 V4 V5
 1:  3  4  6  7  9
 2:  2  2  5  8 10

我想创建一个新列来粘贴列子集的值名称。应保留原始列。

想要的输出是:

 > cols <- paste0("V",2:3)
 > dt
    V1 V2 V3 V4 V5    merged
 1:  3  4  6  7  9 V2:4 V3:6
 2:  2  2  5  8 10 V2:2 V3:5

我能够通过将 .SD 发送到函数并遍历每一行来获得输出:

getSub <- function(SD){
            lapply(1:nrow(SD), function(s) paste0(cols,":", SD[s], collapse=" ")) 
          }
dt[, merged := list(getSub(.SD)), .SDcols=cols]
> dt
   V1 V2 V3 V4 V5              merged
1:  3  4  6  7  9 V1:3 V2:4 V3:6 V4:7
2:  2  2  5  8 10 V1:2 V2:2 V3:5 V4:8

我想知道是否有办法使用像 dt[, merged := list(do.call(paste,c(c(cols,.SD),sep=" "))), .SDcols=cols] 这样的东西,因为它似乎要快得多 https://stackoverflow.com/a/23819177/2070021

【问题讨论】:

  • 如果这是关于r,请相应地标记您的帖子。
  • @PM77-1 抱歉遗漏了。我认为 eddi 已经修复了它。

标签: r data.table


【解决方案1】:

试试这个:

dt[, merged := do.call(paste, Map(function(x, y) paste(x, y, sep = ':'),
                                  names(.SD), .SD)),
     .SDcols = cols]

另一种选择是构造表达式并对其进行评估,但上面的方法似乎足够快,不会打扰那种混乱。

【讨论】:

    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多