r 通过填充行值扩展 data.table 列

标签 r for-loop data.table

我有一个数据表:

library(data.table)
p1 = data.table(a = c(10.34,25.87,53.2), b=c(15.3,183.2,34.8))
print(p1)

       a     b
1: 10.34  15.3
2: 25.87 183.2
3: 53.20  34.8

我想要得到的是一个新的 data.table,其结构如下:

       a     b     a1    b1     a2    b2     a3    b3     
1: 10.34  15.3  10.34  15.3  25.87 183.2   53.2  34.8
2: 25.87 183.2  10.34  15.3  25.87 183.2   53.2  34.8
3: 53.20  34.8  10.34  15.3  25.87 183.2   53.2  34.8

我目前的解决方案是:

p2 = cbind(p,p[1,],p[2,],p[3,])

当我有 10000 行的输入 data.table p 时,如何创建一个类似(除了使用 for 循环)10001 列的 data.table p2?

感谢任何帮助。

最佳答案

这是在 rep 上使用 rbindlistcbind 的另一个选项,用于转置数据帧。

library(data.table)

cbind(p1, rbindlist(rep(list(data.table(t(unlist(p1)))), times = nrow(p1))))
#        a     b    a1    a2   a3   b1    b2   b3
# 1: 10.34  15.3 10.34 25.87 53.2 15.3 183.2 34.8
# 2: 25.87 183.2 10.34 25.87 53.2 15.3 183.2 34.8
# 3: 53.20  34.8 10.34 25.87 53.2 15.3 183.2 34.8

更新

@Frank 在评论中指出,cbind 可以取两个数据帧的行号不相等。在这种情况下,行号较少的数据框将被“回收”。所以我们不需要 reprbindlist 下面是更新后的代码。

cbind(p1, data.table(t(unlist(p1))))
#        a     b    a1    a2   a3   b1    b2   b3
# 1: 10.34  15.3 10.34 25.87 53.2 15.3 183.2 34.8
# 2: 25.87 183.2 10.34 25.87 53.2 15.3 183.2 34.8
# 3: 53.20  34.8 10.34 25.87 53.2 15.3 183.2 34.8

要获得 OP 所需的 col 顺序,一个选项是 setcolorder:

cbind(p1, setcolorder(data.table(t(unlist(p1))), order(row(p1))) )    
#        a     b    a1   b1    a2    b2   a3   b3
# 1: 10.34  15.3 10.34 15.3 25.87 183.2 53.2 34.8
# 2: 25.87 183.2 10.34 15.3 25.87 183.2 53.2 34.8
# 3: 53.20  34.8 10.34 15.3 25.87 183.2 53.2 34.8

关于r 通过填充行值扩展 data.table 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55303994/

相关文章:

javascript - 具有动态 jQuery 选择器的循环事件处理程序

r - 2 个连续的嵌套 for 循环 - 是否可以使用 data.table 或 apply 进行优化?添加了 data.table 尝试尚未优化

r - 将变量与其中许多数据包含在 R 中的行中的变量连接起来

r - 如何在数据表中按天数滞后值

r - 如何在R中关闭管道连接之前从管道连接获取输出?

r - 如何使下载按钮在 R Shiny 的 golem 模块中工作

Python:创建一个将整数转换为字符串的循环

r - fread 未正确读取列名

r - 使用 R 从数据框中过滤空行

java - for 循环不迭代我的 HashMap 键集