R 编程 - 按列组合数据
R Programming - Combine Data Columnwise
我有两个数据集,都具有相同的维度,我想将它们组合起来,使第二个数据集的第一列堆叠在第一个数据集的第一列旁边,依此类推。
考虑下面的示例,这是预期的输出。在这里,v1 来自数据集 1,v2 来自数据集 2。我还想保持列 header 不变。
| v1 | v2 |
|:------:|:------:|
| -0.71 | -0.71 |
| -0.71 | -0.71 |
| -0.71 | -0.71 |
| -0.71 | -0.71 |
| -0.71 | -0.71 |
| -0.71 | -0.71 |
我尝试了 cbind()
和 data.frame()
,但都导致在完整的第一个数据集之后添加第二个数据,而不是逐列添加。
-> dim(firstDataSet)
100 200
-> dim(secondDataSet)
100 200
-> finalDataSet_cbind <- cbind(firstDataSet, secondDataSet)
-> dim(finalDataSet_cbind)
100 400
-> finalDataSet_dframe <- data.frame(firstDataSet, secondDataSet)
-> dim(finalDataSet_dframe)
100 400
请提出正确和更好的实现方法,谢谢。
更新:可能的回应duplicate flag to this question:
这个答案不适合我。我按照解决方案获得的数据没有得到我想要的结果,并且与我使用上述 cbind()
方法获得的最终输出相似。
对我有用,但有一个小问题,即为每列分配新的列名,而不是保留原始列 headers。
此外,我没有足够的声誉来向已接受的答案添加评论。
可能不是 for loop
的最有效解决方案,但有效
data1 <- cbind(1:10,11:20, 21:30)
data2 <- cbind(1:10,11:20, 21:30)
combined <- NULL
for(i in 1:ncol(data1)){
combined <- cbind(combined, data1[,i], data2[,i])
}
要解决列名要求,您可以这样做。基本上,您首先 cbind
,然后以正确的顺序创建索引。使用该索引,您还可以创建一个包含正确列名的向量。然后索引列的顺序,并添加列名。
df1 <- df2 <- data.frame(v1=1:10,v2=11:20, v3=21:30)
final <- cbind(df1,df2)
indexed <- rep(1:ncol(df1), each = 2) + (0:1) * ncol(df1)
new_colnames <- colnames(final)[indexed]
final_ordered <- final[indexed]
colnames(final_ordered) <- new_colnames
v1 v1 v2 v2 v3 v3
1 1 1 11 11 21 21
2 2 2 12 12 22 22
3 3 3 13 13 23 23
4 4 4 14 14 24 24
5 5 5 15 15 25 25
6 6 6 16 16 26 26
7 7 7 17 17 27 27
8 8 8 18 18 28 28
9 9 9 19 19 29 29
10 10 10 20 20 30 30
我有两个数据集,都具有相同的维度,我想将它们组合起来,使第二个数据集的第一列堆叠在第一个数据集的第一列旁边,依此类推。
考虑下面的示例,这是预期的输出。在这里,v1 来自数据集 1,v2 来自数据集 2。我还想保持列 header 不变。
| v1 | v2 |
|:------:|:------:|
| -0.71 | -0.71 |
| -0.71 | -0.71 |
| -0.71 | -0.71 |
| -0.71 | -0.71 |
| -0.71 | -0.71 |
| -0.71 | -0.71 |
我尝试了 cbind()
和 data.frame()
,但都导致在完整的第一个数据集之后添加第二个数据,而不是逐列添加。
-> dim(firstDataSet)
100 200
-> dim(secondDataSet)
100 200
-> finalDataSet_cbind <- cbind(firstDataSet, secondDataSet)
-> dim(finalDataSet_cbind)
100 400
-> finalDataSet_dframe <- data.frame(firstDataSet, secondDataSet)
-> dim(finalDataSet_dframe)
100 400
请提出正确和更好的实现方法,谢谢。
更新:可能的回应duplicate flag to this question:
这个答案不适合我。我按照解决方案获得的数据没有得到我想要的结果,并且与我使用上述 cbind()
方法获得的最终输出相似。
此外,我没有足够的声誉来向已接受的答案添加评论。
可能不是 for loop
的最有效解决方案,但有效
data1 <- cbind(1:10,11:20, 21:30)
data2 <- cbind(1:10,11:20, 21:30)
combined <- NULL
for(i in 1:ncol(data1)){
combined <- cbind(combined, data1[,i], data2[,i])
}
要解决列名要求,您可以这样做。基本上,您首先 cbind
,然后以正确的顺序创建索引。使用该索引,您还可以创建一个包含正确列名的向量。然后索引列的顺序,并添加列名。
df1 <- df2 <- data.frame(v1=1:10,v2=11:20, v3=21:30)
final <- cbind(df1,df2)
indexed <- rep(1:ncol(df1), each = 2) + (0:1) * ncol(df1)
new_colnames <- colnames(final)[indexed]
final_ordered <- final[indexed]
colnames(final_ordered) <- new_colnames
v1 v1 v2 v2 v3 v3
1 1 1 11 11 21 21
2 2 2 12 12 22 22
3 3 3 13 13 23 23
4 4 4 14 14 24 24
5 5 5 15 15 25 25
6 6 6 16 16 26 26
7 7 7 17 17 27 27
8 8 8 18 18 28 28
9 9 9 19 19 29 29
10 10 10 20 20 30 30