【问题标题】:How to create a table using two other tables in R?如何使用 R 中的其他两个表创建一个表?
【发布时间】:2020-12-29 01:46:33
【问题描述】:

我有两张桌子。一个叫enrollment,另一个叫students。

注册

student_id   class_id  
004           compsci
010           compsci
002            engli
010            engli
003            engli

学生:

student_id    first_name
  002           Abril
  004           Chris
  010           Davis
  003           Riley

我需要一个像下面这样的输出表,其中只有first_name 出现在上面两个表中student_id 和first_name 的匹配中。

class_id   first_name   
compsci      Davis
compsci      Chris
engli        Abril
engli        Davis
engli        Riley           
 

数据:

enrollment<-data.frame(student_id=(c(004,010,002,010,003)),class_id=(c("compsci","compsci","engli","engli","engli")))
student<-data.frame(student.id=c(002,004,010,003),first_name=(c("Abril","Chris","Davis","Riley")))

     
 

【问题讨论】:

    标签: r datatables data-manipulation


    【解决方案1】:

    与dplyr:

    library(dplyr)
    #Code
    new <- student %>% left_join(enrollment,by = c('student.id'='student_id')) %>% select(-student.id)
    

    输出:

      first_name class_id
    1      Abril    engli
    2      Chris  compsci
    3      Davis  compsci
    4      Davis    engli
    5      Riley    engli
    

    【讨论】:

    • 那位同时参加 compsci 和engli 的学生 Davis 怎么样?如何让他在输出表中出现两次?谢谢!
    【解决方案2】:

    你可以使用merge命令,即:

    colnames(student)[1] <- 'student_id'
    joined <- merge(enrollment,student,by='student_id')
    joined <- joined[,c('class_id','first_name')]
    

    【讨论】:

      【解决方案3】:

      您也可以使用data.table 方法:

      setDT(enrollment)[student, first_name := i.first_name, on=.(student_id==student.id)][, -'student_id']    
      
         class_id first_name
           <char>     <char>
      1:  compsci      Chris
      2:  compsci      Davis
      3:    engli      Abril
      4:    engli      Davis
      5:    engli      Riley
      

      【讨论】:

        【解决方案4】:

        我们可以从base R使用match

        enrollment$first_name <- student$first_name[match(enrollment$student_id,
                    student$student.id)]
        enrollment[c('class_id', 'first_name')]
        

        -输出

        #    class_id first_name
        #1  compsci      Chris
        #2  compsci      Davis
        #3    engli      Abril
        #4    engli      Davis
        #5    engli      Riley
        

        【讨论】:

        • 那位同时参加 compsci 和engli 的学生 Davis 怎么样?如何让他在输出表中出现两次?谢谢!
        • @TongClaireXu 抱歉,我正在检查其他解决方案的输出。更新了帖子
        • @TongClaireXu 根据您的输入数据,第一个元素应匹配Chris
        猜你喜欢
        • 1970-01-01
        • 2021-09-17
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        • 2021-10-08
        • 2022-12-29
        相关资源
        最近更新 更多