【问题标题】:paste two data.table columns粘贴两个 data.table 列
【发布时间】:2013-08-23 22:40:33
【问题描述】:
dt <- data.table(L=1:5,A=letters[7:11],B=letters[12:16])
   L A B
1: 1 g l
2: 2 h m
3: 3 i n
4: 4 j o
5: 5 k p

现在我想粘贴“A”和“B”列来获得一个新的,我们称之为“新”:

dt2
   L A B new
1: 1 g l  gl
2: 2 h m  hm
3: 3 i n  in
4: 4 j o  jo
5: 5 k p  kp

【问题讨论】:

  • 如果您使用数据框,您可以使用粘贴:dt &lt;- data.frame(L=1:5,A=letters[7:11],B=letters[12:16])dt$new &lt;- paste0(dt$A,dt$B)
  • 好的,我只是想请你发布它。如果不等待 2 天,我无法接受自己的答案...

标签: r data.table


【解决方案1】:

我有一个类似的问题,但有很多列,不想手动键入它们。

新版本

(基于@mnel 的评论)

dt[, new:=do.call(paste0,.SD), .SDcols=-1]

这大约是旧版本的两倍,并且似乎回避了这些怪癖。请注意使用.SDcols 来标识要在paste0 中使用的列。 -1 使用除第一列之外的所有列,因为 OP 想要粘贴列 A 和 B 而不是 L。

如果您想使用不同的分隔符:

dt[ , new := do.call(paste, c(.SD, sep = ":"))]

旧版

您可以使用.SDby 来处理多个列:

dt[,new:=paste0(.SD,collapse=""),by=seq_along(L)]

我添加了seq_along,以防 L 不是唯一的。 (您可以使用dt&lt;-data.table(L=c(1:4,4),A=letters[7:11],B=letters[12:16]) 进行检查)。

另外,在我的实际实例中,出于某种原因,我不得不在paste0 部分中使用t(.SD)。可能还有其他类似的怪癖。

【讨论】:

  • 为此您应该使用do.call(paste0,.SD),例如dt[ , new := do.call(paste0,.SD)]
  • 好建议,我会补充一点,您可能也需要使用.SDcols。我已经更新了答案。
  • 我很好奇您是否知道使用带有不同分隔符的新版本的方法?
  • 如何在这样的构造中删除 NA? paste 不接受 na.rm = TRUEdt[ , new := do.call(paste, c(na.omit(.SD), sep = ':'))] 都不起作用。
【解决方案2】:

Arun's comment 回答了这个问题:

dt[,new:=paste0(A,B)]

【讨论】:

  • 这是我用于非常相似的任务的精确方法,但是我决定使用选项collapse = ".",因为我正在使用结果列new,作为排序的ID,并且添加collapse = 选项意外地改变了行为——在相当大的data.table 上它有效地冻结了R——这实际上是预期的行为还是错误?即:dt[, new := paste0(A, B, collapse = "."] 在此示例中使用的示例表上产生以下内容:l g l l.h m.i n.j o.k p
  • 如果我想将列“new”命名为“AB”,即我想附加列名该怎么办
  • 只使用names(dt)[names(dt)=="new"]
【解决方案3】:

应该这样做:

 dt <- data.table(dt, new = paste(dt$A, dt$B, sep = ""))

【讨论】:

  • 现在我很困惑,这个结果也是我想到的第一个结果。以为我检查了这个选项。无论如何,谢谢!
  • 这更像是 data.table:dt[,new:=paste(dt[,A],dt[,B],sep="")]
  • 是的。这样可行。老实说,我更熟悉数据框。
【解决方案4】:

如果您想严格使用列索引进行粘贴(当您可能不知道行名时)... 我想通过粘贴两列 6 和 4 来获得一个新列

dt$new <- apply( dt[,c(6,4)], 1, function(row){ paste(row[1],row[2],sep="/") })

【讨论】:

  • 这是否意味着我们不能传入列索引来粘贴?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多