2016-06-13 60 views
2

當多個數據幀,我想指出以前的數據幀開始在哪裏。所以在使用時:用行指標Rbind多個data.frames

df1<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4)) 
df2<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4)) 
dfTotal<-rbind(df1,df2) 

我想有一個指標,其中df2已在dfTotal中開始。


兩個問題:

  1. 可以這樣做?
  2. 有沒有更好的方法讓第一列從1到8?

回答

2

這個怎麼樣使用base R裏面的函數:

cbind(indicator=c(rep("df1", nrow(df1)), rep("df2", nrow(df2))) ,dfTotal<-rbind(df1,df2)) 

會給你:

indicator c.1..2..3..4. rnorm.1.4. rnorm.1.4..1 rnorm.1.4..2 
1  df1    1 -0.50219235 0.1169713 -0.82525943 
2  df1    2 0.13153117 0.3186301 -0.35986213 
3  df1    3 -0.07891709 -0.5817907 0.08988614 
4  df1    4 0.88678481 0.7145327 0.09627446 
5  df2    1 -0.20163395 -0.3888542 -0.43808998 
6  df2    2 0.73984050 0.5108563 0.76406062 
7  df2    3 0.12337950 -0.9138142 0.26196129 
8  df2    4 -0.02931671 2.3102968 0.77340460 

DATA

set.seed(100) 
df1<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4)) 
df2<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4)) 
dfTotal<-rbind(df1,df2) 
+1

基準獲得一排指示燈是錯誤的。請至少檢查結果的維度是否符合預期!無論你在函數內部使用'mget(ls())',你都需要從正確的環境中獲取值。 – Arun

+0

@阿倫,謝謝你指出這一點。我暫時刪除了基準。我稍後會看一看。 – 989

3

我們可以使用rbindlistidcol參數

library(data.table) 
rbindlist(list(df1,df2), idcol='grp') 

如果有與模式「東風」後面數字,我們可以用mgetpaste得到所有數據集中在一個'清單

多個數據集
rbindlist(mget(paste0("df", 1:2)), idcol = "grp") 

或者使用bind_rowsdplyr

library(dplyr) 
bind_rows(df1, df2, .id='grp') 

或者,我們可以以緊湊的方式使用base R

do.call(rbind, Map(cbind, ind = 1:2, mget(paste0("df", 1:2)))) 
0

這裏是放data.frames成列表操作更長的基礎R方法:

# put the data.frames into a list 
dfList <- mget(ls(pattern="df[0-9]+")) 

# append the list of data.frames into a single data.frame 
dfTotal <- do.call(rbind, dfList) 

# get the ID from the row names 
dfTotal$id <- as.integer(gsub("^df(\\d)+.*", "\\1", rownames(dfTotal))) 

要了解更多關於數據列表的工作。幀,看看this post

+0

在第一行中,我猜,'mget'還需要一個括號。 – 989

+0

@ m0h3n感謝您的支持。 – lmo

1

簡單的方式通過添加DF1和DF2 2變量如下

df1<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4),map="d1") 
df2<-data.frame(c(1,2,3,4),rnorm(1:4),rnorm(1:4),rnorm(1:4),map="d2") 
dfTotal<-rbind(df1,df2) 

    c.1..2..3..4. rnorm.1.4. rnorm.1.4..1 rnorm.1.4..2 map 
1    1 1.5211423 -0.05746568 0.7507580 d1 
2    2 -0.5016556 0.33257341 -0.7042438 d1 
3    3 -0.7154221 -0.79463908 -1.0391944 d1 
4    4 -0.3255207 0.04130148 -1.4263133 d1 
5    1 -1.5784721 0.58019130 -0.2091264 d2 
6    2 -1.1682966 -0.17827840 1.3235675 d2 
7    3 0.3025030 1.98774090 0.3537830 d2 
8    4 2.5133713 -0.28664053 1.0521226 d2 
+1

如果您是數據的生成器,則可能會出現這種情況。 – 989

+0

@ m0h3n你的真實 –