使用行指示符绑定多个data.frames

时间:2016-06-13 12:16:51

标签: r rbind

rbind多个数据帧时,我想指出以前的数据帧的起始位置。所以在使用时:

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?

4 个答案:

答案 0 :(得分:3)

我们可以将rbindlistidcol参数

一起使用
library(data.table)
rbindlist(list(df1,df2), idcol='grp')

如果有多个数据集带有模式&#39; df&#39;接下来是数字,我们可以使用mgetpaste来获取“list

中的所有数据集
rbindlist(mget(paste0("df", 1:2)), idcol = "grp")

或使用bind_rows

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

或者我们可以以紧凑的方式使用base R

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

答案 1 :(得分: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

数据

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)

答案 2 :(得分: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

答案 3 :(得分:0)

这是一个较长的基本R方法,它将data.frames放入一个列表中进行操作:

# 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)))

要了解有关使用data.frames列表的更多信息,请查看this post