r - 在 R data.table 中粘贴多列对的有效方法

标签 r data.table paste split-apply-combine

我正在寻找一种使用 data.table 一次粘贴/合并多对相邻列的有效方法。我的微弱尝试很慢,也不那么优雅:

library(data.table)
dt <- data.table(ids = 1:3,
                 x1 = c("A","B","C"),
                 x2 = 1:3,
                 y1 = c("D", "E", "F"),
                 y2 = 4:6,
                 z1 = c("G", "H", "I"),
                 z3 = 7:9)

paste.pairs <- function(x, sep = "-"){
  xx <- unlist(x)
  x.len <- length(x)

  r <- rep(NA, x.len/2)
  s <- seq(1, x.len, by = 2)

  for(i in 1:(x.len/2)) {
    r[i] <- paste(xx[i], xx[i+1], sep = sep)
  }
  return(as.list(r))
}

dt[, paste.pairs(.SD), by = "ids"]

有没有更好的办法?

最佳答案

通过使用 seq 创建列索引来使用 Map 的选项

i1 <- seq(1, length(dt)-1, 2)
i2 <- seq(2, length(dt)-1, 2)
dt[, Map(paste,
         .SD[, i1, with = FALSE], .SD[, i2, with = FALSE], 
         MoreArgs = list(sep="-")), 
   by = "ids"]

另一种选择是按数据集的名称拆分,然后粘贴

data.frame(lapply(split.default(dt[, -1, with = FALSE],
    sub("\\d+$", "", names(dt)[-1])), function(x) do.call(paste, c(x, sep="-"))))
#  x   y   z
#1 A-1 D-4 G-7
#2 B-2 E-5 H-8
#3 C-3 F-6 I-9

或者另一种选择是使用 melt/dcast

dcast(melt(dt, id.var = 'ids')[,  paste(value, collapse = "-"),
  .(grp = sub("\\d+", "", variable), ids)], ids ~ grp, value.var = 'V1')

关于r - 在 R data.table 中粘贴多列对的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262149/

相关文章:

r - 在 R 中,修改类中的值

r - 将数据表中的行熔化或复制一定次数并在 R 中包含计数器

r - 快速滚动平均值 + 汇总

r - paste() 函数和变量的排序级别

delphi - 为什么抑制WM_PASTE后数据集的状态变为dsEdit?

r - 使用 qqmath 或 dotplot : How to make it look fancy? 绘制来自 lmer(lme4 包)的随机效应

r - 是否可以根据行范围和 r 中的逻辑条件对 data.frame 进行子集化?

r - 在 R/mxnet 中正确格式化 lstm 循环神经网络的数据

r - 如何在 R 中的 data.table 中使用具有累积值的移位计算

R粘贴字符串折叠 - 如何用引号保留字符串?