2016-08-11 125 views
2

我有4個數據幀具有這種結構:遍歷多個數據幀

DATA1:

1.8064 2.2016 2.4506 2.1828 2.1171 1.9308 2.1707 2.1885 
2.2310 2.2400 1.9115 2.1527 2.0934 1.7989 2.2144 2.0091 
1.9248 2.2038 1.9676 1.9224 1.9502 1.7990 2.0824 2.1300 
2.0095 2.0341 1.8433 1.8361 1.9958 1.8243 2.0397 2.0482 
2.1143 2.2627 1.7620 1.7561 1.9490 1.9803 1.9336 2.2511 
2.2377 2.5414 1.7867 1.6618 2.5090 1.8325 2.0212 2.1616 
2.3476 2.1878 2.0469 1.7508 2.2969 1.7939 2.0291 2.0721 
2.3534 2.0932 2.3502 1.9960 2.0710 1.9923 1.7787 1.9772 
2.2607 2.1504 2.3685 2.1148 2.1961 1.7738 1.8405 2.0135 
2.2411 1.9916 2.4726 2.0347 2.0751 1.7570 1.8874 1.9385 

DATA2:

2.1913 1.8981 2.2441 2.3068 2.1198 2.1484 1.8056 1.7747 
2.0842 1.8750 2.3023 2.1204 1.8972 2.1534 1.8028 1.9401 
2.2105 1.9618 2.2472 1.9656 2.3098 1.9771 1.9520 1.8627 
2.2863 1.9959 2.1781 1.9544 1.9281 1.9286 1.9699 2.0330 
2.1987 2.0583 2.0953 2.0206 2.1148 2.3789 1.7052 1.9145 
2.0513 2.0850 1.9810 2.4943 1.9120 2.2209 1.9461 2.0882 
2.0049 2.0416 1.9303 2.3681 1.8974 2.0054 1.9261 1.9097 
1.6882 2.1196 1.8641 2.3600 2.0931 1.7641 2.1131 1.7748 
1.8840 1.7604 1.7664 2.2000 2.0055 1.8229 1.9871 1.9168 
1.7340 1.9656 1.8480 2.0523 1.9950 1.8716 1.9206 1.7786 
1.9604 1.9804 1.9601 2.0599 1.8969 1.8087 2.1845 1.8598 

DATA3:

1.8064 2.2016 2.4506 2.1828 2.1171 1.9308 2.1707 2.1885 
2.2310 2.2400 1.9115 2.1527 2.0934 1.7989 2.2144 2.0091 
1.9248 2.2038 1.9676 1.9224 1.9502 1.7990 2.0824 2.1300 
2.0095 2.0341 1.8433 1.8361 1.9958 1.8243 2.0397 2.0482 
2.1143 2.2627 1.7620 1.7561 1.9490 1.9803 1.9336 2.2511 
2.2377 2.5414 1.7867 1.6618 2.5090 1.8325 2.0212 2.1616 
2.3476 2.1878 2.0469 1.7508 2.2969 1.7939 2.0291 2.0721 
2.3534 2.0932 2.3502 1.9960 2.0710 1.9923 1.7787 1.9772 
2.2607 2.1504 2.3685 2.1148 2.1961 1.7738 1.8405 2.0135 
2.2411 1.9916 2.4726 2.0347 2.0751 1.7570 1.8874 1.9385 

data4:

2.1913 1.8981 2.2441 2.3068 2.1198 2.1484 1.8056 1.7747 
2.0842 1.8750 2.3023 2.1204 1.8972 2.1534 1.8028 1.9401 
2.2105 1.9618 2.2472 1.9656 2.3098 1.9771 1.9520 1.8627 
2.2863 1.9959 2.1781 1.9544 1.9281 1.9286 1.9699 2.0330 
2.1987 2.0583 2.0953 2.0206 2.1148 2.3789 1.7052 1.9145 
2.0513 2.0850 1.9810 2.4943 1.9120 2.2209 1.9461 2.0882 
2.0049 2.0416 1.9303 2.3681 1.8974 2.0054 1.9261 1.9097 
1.6882 2.1196 1.8641 2.3600 2.0931 1.7641 2.1131 1.7748 
1.8840 1.7604 1.7664 2.2000 2.0055 1.8229 1.9871 1.9168 
1.7340 1.9656 1.8480 2.0523 1.9950 1.8716 1.9206 1.7786 
1.9604 1.9804 1.9601 2.0599 1.8969 1.8087 2.1845 1.8598 

我需要從DATA4從數據3和第1列得到數據1列1,從數據2 1列,第1列,並將它們組合成一個單一的數據幀,並排而做相同的其他列。

我用這個方法,但它是一個有點簡陋

dat1 <- data.frame(data1$V1) 
dat2 <- data.frame(data2$V1) 
dat3 <- data.frame(data3$V1) 
dat4 <- data.frame(data4$V1) 

final_data1 <- cbind(dat1,dat2,dat3,dat4) 
. 
. 
. 


dat1 <- data.frame(data1$V8) 
dat2 <- data.frame(data2$V8) 
dat3 <- data.frame(data3$V8) 
dat4 <- data.frame(data4$V8) 

final_data8 <- cbind(dat1,dat2,dat3,dat4) 

有沒有辦法用一個循環做到這一點?

回答

2

我們可以通過列循環,約束他們,並保持所產生的8個dataframes在列表中:

res <- lapply(1:8, function(i){ cbind(data1[i], data2[i], data3[i], data4[i]) }) 
+0

是的,這工作,但我怎麼能提取從該列表中創建的8數據幀?我會用它們來製作直方圖。 – Enrique

+1

@Enrique'res [[1]]'應該給你第一個data.frame。 – zx8754

+0

另一個問題。如果我想加入四個數據框但每個都有不同的大小。我如何能夠用你的方法加入他們?我的意思是例如:dat1與100對象,dat2與50對象等... – Enrique

1

我們可以將所有數據放在list中,將第一列和cbind一起提取出來。

do.call(cbind, lapply(mget(paste0("data", 1:4)), `[`, 1)) 

這可能是更好的一個id山坳保持在一個單一的數據集來引用該數據集從

library(data.table) 
dt <- rbindlist(mget(paste0("data", 1:4)), idcol = TRUE) 

另外,對於繪圖的目的,它可能是更好地保持在來到'長' 格式

dL <- melt(dt, id.var = ".id") 

,並使用ggplot繪製

library(ggplot2) 
ggplot(dL, aes(value, ..density.., colour = variable)) + 
         geom_freqpoly() 

或者使用geom_histogramfacet_wrap(對於每一列個別地塊)

ggplot(dL, aes(value)) + 
     geom_histogram() + 
     facet_wrap(~variable) 
-1

您可以使用eval(parse())建設:

df1 = data.frame(V1 = 1:10) 
df2 = data.frame(V1 = 1:10) 
df3 = data.frame(V1 = 1:10) 
df4 = data.frame(V1 = 1:10) 

final = matrix(NA, nrow = nrow(df1), ncol = 4) 

for (i in 1:4) { 
    final[, i] = eval(parse(text = paste0('df', i, '$V1'))) 
} 

另一種方法是將所有DFS在列表和lapply使用:

dfList = list(df1, df2, df3, df4) 
do.call(cbind, lapply(dfList, `[[`, 'V1')) 

以上,lapply遍歷所有的數據幀和ret列出每個元素是第一列的列表。部分do.call(cbind, ...)然後將所有這些元素一起綁定到一個矩陣中。