使用R将大量不同的data.frames集合合并到列表中

使用R将大量不同的data.frames集合合并到列表中,r,list,dataframe,R,List,Dataframe,我收集了五个不同列的R数据帧。每个data.frame都包含一个唯一的标识符ID。对于某些数据帧,ID与其余列之间存在一对一的关系(即,对于每个ID,data.frame中有一行数据)。对于其他数据帧,ID与其余列之间存在一对多关系(一个ID,在data.frame中有多行数据与该ID关联)。数据来自SQL数据库,因此数据帧是根据对该数据库进行的查询构造的还必须指出,并非所有ID都出现在每个data.frame中。因此,在五个数据帧之间,没有一组共同的ID。当您看到下面的代码时,这就是我使用子设

我收集了五个不同列的R数据帧。每个
data.frame
都包含一个唯一的标识符ID。对于某些数据帧,ID与其余列之间存在一对一的关系(即,对于每个ID,
data.frame
中有一行数据)。对于其他数据帧,ID与其余列之间存在一对多关系(一个ID,在
data.frame
中有多行数据与该ID关联)。数据来自SQL数据库,因此数据帧是根据对该数据库进行的查询构造的还必须指出,并非所有ID都出现在每个
data.frame
中。因此,在五个数据帧之间,没有一组共同的ID。
当您看到下面的代码时,这就是我使用子设置的原因

我想将我拥有的五个数据帧重新组合成一个列表列表,其中列表列表中的每个成员都是一个包含每个ID的所有数据的五部分列表。列表中每个成员的每个部分都是一个
data.frame
,只包含来自该ID的数据

到目前为止,我正在使用一个简单的
for
循环,在循环中通过ID进行子集设置,以在R中实现这一点。它工作可靠,但当我的ID计数达到10000时,使用
for
循环方法重新构造数据可能需要30多分钟,甚至数小时。我知道在R中,for循环通常是不受欢迎的,但我还没有找到一种快速有效地实现这一点的不同方法,尽管我花了很多时间在互联网上搜索这一点。我有一个
lappy
版本的
for
循环,看起来很相似,但似乎没有多大帮助

我不知道速度问题是因为
for
循环使用,还是所有的子设置都是减速的原因。如果这有助于将数据帧规范化为一组通用的ID,那么我当然可以这样做。尽管如此,我目前还不确定如何做到这一点

这是我的
循环的R代码,您可以看到我现在在做什么。请注意,我为列表列表预先分配了容器,这有助于在这种方法的上下文中加快速度

  numIDs <- nrows(df1)
  final.list <- vector(mode="list",length=numIDs)
  for (i in 1:numIDs) {
    wd <- df1[i,]
    pd <- df2[df2$id==wd$id,]
    fd <- df3[df3$id==wd$id,]
    dd <- df4[df4$id==wd$id,]
    ed <- df5[df5$id==wd$id,]
    final.list[[i]] <- list(rdf1=wd,rdf2=pd,rdf3=fd,rdf4=dd,rdf5=ed)
  }

numIDs如果您的最终列表格式不必与您显示的内容完全匹配,那么此代码可能会起作用

# Create dataframes  
df1 <- data.frame("id"=c("r1","r2","r3"), "c1"=c(1,2,3), "c2"=c("a","b","c"), stringsAsFactors=F)
df2 <- data.frame("id"=c("r1","r3"), "d1"=c(1000,3000), "d2"=c("l","n"), stringsAsFactors=F)
df3 <- data.frame("id"=c("r1","r2","r3"), "e1"=c(100,200,300),  "e2"=c("x","y","z"), stringsAsFactors=F)

# Rename columns (must be same for rbind)
colnames(df1) <- c('id', 'x1', 'x2'); colnames(df2) <- c('id', 'x1', 'x2'); colnames(df3) <- c('id', 'x1', 'x2')

# Rbind dataframes together
final.list <- rbind(df1, df2, df3)

# Split into a list
final.list <- split(final.list, final.list$id)
final.list
#创建数据帧

df1您可以发布5个数据帧中的一些样本数据,以及您希望最终输出的样子吗?”“rbind”或“join”可能是您正在寻找的。@Monk-为post添加了一些数据和最终输出。谢谢,但我的实际数据帧有不同的列,以及一对多关系,这些关系排除了使用rbind之类的东西。我想知道的是,我在一大组数据帧上所做的子集设置(比如说10个数千个唯一ID)是否是速度的罪魁祸首。因此,我正在研究
data.table
及其
setKey
功能。我只是想测试一下,你能不能更新你提供的样本数据,让它更能反映你的实际数据(以及你希望最终的输出是什么)?
# Create dataframes  
df1 <- data.frame("id"=c("r1","r2","r3"), "c1"=c(1,2,3), "c2"=c("a","b","c"), stringsAsFactors=F)
df2 <- data.frame("id"=c("r1","r3"), "d1"=c(1000,3000), "d2"=c("l","n"), stringsAsFactors=F)
df3 <- data.frame("id"=c("r1","r2","r3"), "e1"=c(100,200,300),  "e2"=c("x","y","z"), stringsAsFactors=F)

# Rename columns (must be same for rbind)
colnames(df1) <- c('id', 'x1', 'x2'); colnames(df2) <- c('id', 'x1', 'x2'); colnames(df3) <- c('id', 'x1', 'x2')

# Rbind dataframes together
final.list <- rbind(df1, df2, df3)

# Split into a list
final.list <- split(final.list, final.list$id)
final.list