2017-08-11 65 views
1

我正在尋找從底部開始綁定不同長度數據幀的選項(最好使用基本R)。其餘/缺失的行應該是NAd。例如:從底部的列綁定不同長度的數據幀

set.seed(1212) 
a = as.data.frame(rnorm(1, 0, 1)) 
b = as.data.frame(rnorm(4, 0, 1)) 
c = as.data.frame(rnorm(3, 0, 1)) 

預期輸出:

rnorm(1, 0, 1) rnorm(4, 0, 1) rnorm(3, 0, 1) 
1 NA    1.8374224  NA 
2 NA    0.3436815  0.03719874 
3 NA    -1.3600955  -1.92311898 
4 -0.6290858  0.5358145  0.41087971 
+1

使用'rowr :: cbind.fill(A,B,C)' – akrun

+0

感謝@akrun。有沒有什麼辦法可以使用基礎R來做到這一點? 'cbind()'或'merge()'? – AK88

+1

它不會是一個基線R中的單線程,或者是非常複雜的單線程。已經提出了很多類似的問題,所以你一定能找到基準答案。 – lmo

回答

2

首先,評估列的最大長度結合。

lenMax <- max(length(a[,1]), length(b[,1]), length(c[,1])) 

然後,使用此長度填充具有NAs的新數據框的列,以便它們適合。

data.frame(a = c(rep(NA, lenMax - length(a[,1])), a[,1]), 
      b = c(rep(NA, lenMax - length(b[,1])), b[,1]), 
      c = c(rep(NA, lenMax - length(c[,1])), c[,1])) 

#   a   b   c 
# 1   NA 1.8374224   NA 
# 2   NA 0.3436815 0.03719874 
# 3   NA -1.3600955 -1.92311898 
# 4 -0.6290858 0.5358145 0.41087971 
2

您可以使用smartbind()

gtools::smartbind(a,b,c) 
# rnorm(1, 0, 1) rnorm(4, 0, 1) rnorm(3, 0, 1) 
#1  -0.6290858    NA    NA 
#2:1    NA  1.8374224    NA 
#2:2    NA  0.3436815    NA 
#2:3    NA  -1.3600955    NA 
#2:4    NA  0.5358145    NA 
#3:1    NA    NA  0.03719874 
#3:2    NA    NA -1.92311898 
#3:3    NA    NA  0.41087971 
1

我們可以使用rowr

library(rowr) 
apply(rowr::cbind.fill(a, b, c, fill = NA), 2, function(x) x[order(!is.na(x))]) 
# rnorm.1..0..1. rnorm.4..0..1. rnorm.3..0..1. 
#[1,]    NA  1.8374224    NA 
#[2,]    NA  0.3436815  0.03719874 
#[3,]    NA  -1.3600955 -1.92311898 
#[4,]  -0.6290858  0.5358145  0.41087971 
相關問題