【问题标题】:Update a column in df2 by matching patterns in columns in df1 & df2 using R通过使用 R 匹配 df1 和 df2 中的列中的模式来更新 df2 中的列
【发布时间】:2017-01-01 02:07:15
【问题描述】:

我有 2 个这样的数据框

TEAM <- c("PE","PE","MPI","TDT","HPT","ATD")
CODE <- c(NA,"F","A","H","G","D")
df1 <- data.frame(TEAM,CODE)

CODE <- c(NA,"F100","A234","D664","H435","G123","A666","D345","G324",NA)
TEAM <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)
df2 <- data.frame(CODE,TEAM)

我正在尝试通过将 df1 中的代码列中的第一个字母与 df2 中的代码列匹配来更新 df2 中的 TEAM

我想要的 df2 输出

   CODE TEAM
1    NA   PE
2  F100   PE
3  A234  MPI
4  D664  ATD
5  H435  TDT
6  G123  HPT
7  A666  MPI
8  D345  ATD
9  G324  HPT
10   NA   PE

我正在用 sqldf 尝试这种方式,但它不正确

library(sqldf)
df2 <- sqldf(c("update df2 set TEAM = 
                  case
                    when CODE like '%F%' then 'PE'
                    when CODE like '%A%' then 'MPI'
                    when CODE like '%D%' then 'ATD'
                    when CODE like '%G%' then 'HPT'
                    when CODE like '%H%' then 'TDT'
                    else 'NA'
                  end"))

有人可以帮我提供一些在没有 sqldf 的情况下实现这一目标的方向吗?

【问题讨论】:

    标签: r dplyr reshape2 sqldf


    【解决方案1】:

    使用matchsubstr(都在基础R 中):

    df2$TEAM = df1$TEAM[match(substr(df2$CODE, 1, 1), df1$CODE)]
    
    df2
    #    CODE TEAM
    # 1  <NA>   PE
    # 2  F100   PE
    # 3  A234  MPI
    # 4  D664  ATD
    # 5  H435  TDT
    # 6  G123  HPT
    # 7  A666  MPI
    # 8  D345  ATD
    # 9  G324  HPT
    # 10 <NA>   PE
    

    这对于单个案例是权宜之计 - 如果您经常这样做,我鼓励您将代码的第一个字母提取到它自己的列中,CODE_1,然后执行常规 merge 或加入。

    【讨论】:

      【解决方案2】:

      假设您正在寻找 sqldf 解决方案,请尝试以下操作:

      sqldf("select CODE, 
                    case
                       when CODE like 'F%' then 'PE'
                       when CODE like 'A%' then 'MPI'
                       when CODE like 'D%' then 'ATD'
                       when CODE like 'G%' then 'HPT'
                       when CODE like 'H%' then 'TDT'
                       else 'PE'
                    end TEAM from df2", method = "raw")
      

      或者这个:

      sqldf("select df2.CODE, coalesce(df1.TEAM, 'PE') TEAM 
             from df2 
             left join df1 on substr(df2.CODE, 1, 1) = df1.CODE")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        相关资源
        最近更新 更多