2015-05-10 18 views
6

Soru this one'a çok benzer. Veri çerçevelerinin bir listesini daha uzun bir veri çerçevesine birleştirmek içindir. Bununla birlikte, listenin hangi öğesinden hangi bilgiden alınacağını, listenin dizinine (id veya source) ek bir sütun ekleyerek saklamak istiyorum. R: Veri çerçevelerinin listesini tek bir veri çerçevesine birleştirin, liste dizinine sahip sütun ekleyin

Bu

verileri (bağlı örneğin borç kod): Aşağıdaki kod kullanarak

dfList <- NULL 
set.seed(1) 
for (i in 1:3) { 
    dfList[[i]] <- data.frame(a=sample(letters, 5, rep=T), b=rnorm(5), c=rnorm(5)) 
} 

birleştirilmiş bir veri çerçevesi içerir, ancak liste indeksi .:

df <- do.call("rbind", dfList) 
için sütun eklemez

Listedeki kökeni yakalamak için bir sütun oluştururken listedeki veri çerçevelerini nasıl birleştiririm? aşağıdaki gibi şey:

enter image description here

önceden size çok teşekkür ederim.

cevap

6

## devtools::install_github("Rdatatable/data.table", build_vignettes = FALSE) 
library(data.table) # v >= 1.9.5 
rbindlist(dfList, idcol = "index") 
#  index a   b   c 
# 1:  1 g 1.27242932 -0.005767173 
# 2:  1 j 0.41464143 2.404653389 
# 3:  1 o -1.53995004 0.763593461 
# 4:  1 x -0.92856703 -0.799009249 
# 5:  1 f -0.29472045 -1.147657009 
# 6:  2 k -0.04493361 0.918977372 
# 7:  2 a -0.01619026 0.782136301 
# 8:  2 j 0.94383621 0.074564983 
# 9:  2 w 0.82122120 -1.989351696 
# 10:  2 i 0.59390132 0.619825748 
# 11:  3 m -1.28459935 -0.649471647 
# 12:  3 w 0.04672617 0.726750747 
# 13:  3 l -0.23570656 1.151911754 
# 14:  3 g -0.54288826 0.992160365 
# 15:  3 b -0.43331032 -0.429513109 
3

verison devel gelen data.table::rbindlist Dene tabanında yapabilirsiniz:

df[["index"]] <- rep(seq_along(dfList), sapply(dfList, nrow)) 
df 

## a   b   c index 
## 1 g 1.27242932 -0.005767173  1 
## 2 j 0.41464143 2.404653389  1 
## 3 o -1.53995004 0.763593461  1 
## 4 x -0.92856703 -0.799009249  1 
## 5 f -0.29472045 -1.147657009  1 
## 6 k -0.04493361 0.918977372  2 
## 7 a -0.01619026 0.782136301  2 
## 8 j 0.94383621 0.074564983  2 
## 9 w 0.82122120 -1.989351696  2 
## 10 i 0.59390132 0.619825748  2 
## 11 m -1.28459935 -0.649471647  3 
## 12 w 0.04672617 0.726750747  3 
## 13 l -0.23570656 1.151911754  3 
## 14 g -0.54288826 0.992160365  3 
## 15 b -0.43331032 -0.429513109  3 

Ayrıca yapabilirsiniz:

library(qdapTools) 
list_df2df(setNames(dfList, 1:3), "index") 

## index a   b   c 
## 1  1 g 1.27242932 -0.005767173 
## 2  1 j 0.41464143 2.404653389 
## 3  1 o -1.53995004 0.763593461 
## 4  1 x -0.92856703 -0.799009249 
## 5  1 f -0.29472045 -1.147657009 
## 6  2 k -0.04493361 0.918977372 
## 7  2 a -0.01619026 0.782136301 
## 8  2 j 0.94383621 0.074564983 
## 9  2 w 0.82122120 -1.989351696 
## 10  2 i 0.59390132 0.619825748 
## 11  3 m -1.28459935 -0.649471647 
## 12  3 w 0.04672617 0.726750747 
## 13  3 l -0.23570656 1.151911754 
## 14  3 g -0.54288826 0.992160365 
## 15  3 b -0.43331032 -0.429513109 
1

Bu yapan bir dplyr çözümdür tam olarak aradığınız şey:

dfList <- NULL 
set.seed(1) 
for (i in 1:3) { 
    dfList[[i]] <- data.frame(a=sample(letters, 5, rep=T), b=rnorm(5), c=rnorm(5)) 
} 

df <- dplyr::bind_rows(dfList, .id = "index") 
İlgili konular