【问题标题】:Assign grading based on available data in R data.frame?根据 R data.frame 中的可用数据分配分级?
【发布时间】:2021-08-30 17:03:12
【问题描述】:

我有以下两个data.frame。我想从D1 中获取Grade 并分配给D 中的Pts。操作完成后,Ddata.frame 应该有 PtsValGrade 的列,没有 CGood Grade

D <- data.frame(Pts= c("A","B","D"), Val = c(3.5,4,5))
D1 = data.frame(Pts = c("A","B","C", "D"), Grade = c("Ugly", "Bad", "Good", "Excellent"))

D$Grade <- D1$Grade

【问题讨论】:

    标签: r dataframe tags reshape assign


    【解决方案1】:

    我们可以通过“Pts”列加入on 来使用data.table 中的连接,并将(:=)“等级”从 D1 分配到 D

    library(data.table)
    setDT(D)[D1, Grade := Grade, on = .(Pts)]
    

    -输出

    D
       Pts Val     Grade
    1:   A 3.5      Ugly
    2:   B 4.0       Bad
    3:   D 5.0 Excellent
    

    base R,可以用merge做同样的事情,或者更快的match

    D$Grade <- D1$Grade[match(D$Pts, D1$Pts)]
    

    代码行

    D$Grade <- D1$Grade
    

    由于多种原因无法正常工作

    1. 行数不一样
    2. 即使行数相同,两个数据集中的“Pts”也可能不匹配元素

    【讨论】:

      【解决方案2】:

      你可以使用左连接:

      library(dplyr)
      
      D %>%
        left_join(D1, by="Pts")
      

      【讨论】:

      • 谢谢 - 如果您在 D1 data.frame 中没有其他列并且只对 Grade 感兴趣,这将起作用。否则,所有列都将导出到D
      • 是的,但是您可以先在 D1 上使用选择语句,也可以在生成的 data.frame 上使用选择语句。
      猜你喜欢
      • 2016-05-18
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多