在R中,将不同数据帧的相同摘要列合并为一个新数据帧

时间:2018-04-04 12:04:30

标签: r

我有大约40个具有相同结构的数据帧(df1,df2,df3等),每个数据帧有25列。 我可以运行摘要(df1),摘要(df2)等。 摘要包括几个列,我对摘要的这一列感兴趣:

对于df1,它是

stage 
stage1  :2222 
stage2  :1212 
stage3  :8898

对于df2,它是

stage 
stage1  :2334 
stage2  :9887 
stage3  :2344

对于df3,它是

stage 
stage1  :5334 
stage2  :4887 
stage3  :344

我想创建一个新的df:

           df1      df2      df3      ...
stage1     2222     2334     5334     ... 
stage2     1212     9887     4887     ...
stage3     8898     2344     344      ...

谢谢!

2 个答案:

答案 0 :(得分:0)

您的数据框中的列stage似乎是一个包含3个级别的因素:stage1stage2stage3。我无法确定,因为您没有提供可重复的示例,但如果是这样的话:

假设你有数据帧

df <- data.frame(stage = as.factor(c('stage1', 'stage2', 'stage1', 'stage3', 'stage2', 'stage2')))
df2 <- data.frame(stage = as.factor(c('stage3', 'stage2', 'stage3', 'stage3', 'stage2', 'stage1')))

您可以使用summary()

询问出现的数量
summary(df$stage)
#stage1 stage2 stage3 
#     2      3      1 

使用rbind()合并结果,您可以在一个数据框中出现阶段。

dfstages <- as.data.frame(rbind(summary(df$stage), summary(df2$stage)))
#  stage1 stage2 stage3
#1      2      3      1
#2      1      2      3

答案 1 :(得分:0)

通过将数据帧名称添加到每个帧并使用summary(),可以避免必须通过table()处理数据帧中的所有变量,以获得一列的频率计数。 以下是使用table()的另一种方法,包括数据框名称

生成样本数据后,我们将数据帧分配给列表以添加数据帧名称列,然后使用stage计算频率。通过在表中包含数据框名称作为第二维,我们获得了所需的输出:具有# # create example data df1 <-data.frame(stage =c(rep("stage1",2222), rep("stage2",1212), rep("stage3",8898))) df2 <-data.frame(stage =c(rep("stage1",2334), rep("stage2",9887), rep("stage3",2344))) df3 <-data.frame(stage =c(rep("stage1",5334), rep("stage2",4887), rep("stage3",344))) theList <- list(df1=df1,df2=df2,df3=df3) # add data frame name as column in each data frame for(i in 1:length(theList)) { theList[[i]]$dfname <- names(theList[i]) } # rbind to one data frame before generating frequencies theData <- do.call(rbind,theList) table(theData$stage , theData$dfname) 变量值的行,具有数据框名称的列。

> table(theData$stage , theData$dfname)

          df1  df2  df3
  stage1 2222 2334 5334
  stage2 1212 9887 4887
  stage3 8898 2344  344
> 

...和输出:

select s1.student_id
        , s1.student_fname
        , s1.student_lname
        , c.course
 from course c
      join student2 s2 on s2.course_id = c.course_id
      join student1 s1 on s1.student_id = s2.student_id
 where c.location = 'Burwood';