我有一个数据表:
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
上使用 rbindlist
和 cbind
的另一个选项,用于转置数据帧。
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
可以取两个数据帧的行号不相等。在这种情况下,行号较少的数据框将被“回收”。所以我们不需要 rep
或 rbindlist
下面是更新后的代码。
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/