【问题标题】:R: ifelse statement: comparing data.framesR:ifelse 语句:比较 data.frames
【发布时间】:2015-03-19 13:03:26
【问题描述】:

我有 2 个数据框,我试图将其中的值与另一个进行比较 如果表 1 和表 2 中的值都匹配,则将表 2 中的第三个值插入表 1。

示例Table My DF

    words number
 1      it      1
 2     was      2
 3     the      3
 4     LTD QTY  4
 5     end      5
 6      of      6
 7  winter      7

表 x.sub

   lev_dist    Var1    Var2
31        1 LTD QTY LTD QTY

我想说的是,如果 x.sub 中的 Var1 等于 MyDF 中的单词,则在 mydf 中单词旁边的第三列中插入 x.sub.lev_dist

我的尝试低于但在结果中不断产生 3 而不是 lev_value

mydf$lev_dist <- ifelse(test = (mydf$words == x.sub$Var1),x.sub$Var1,0)

结果:

    words number lev_dist
1      it      1        0
2     was      2        0
3     the      3        0
4 LTD QTY      4        3
5     end      5        0
6      of      6        0
7  winter      7        0

谁能帮忙

【问题讨论】:

  • 检查 x.sub$Var1 是否为因子。在这种情况下,请尝试as.character(x.sub$Var1), 0)
  • 你是绝对正确的......这是一个非常糟糕的错误,但感谢你把它捡起来......最终答案是:mydf$lev_dist
  • 您也可以尝试使用data.table 包及其二进制连接有效地解决它,类似于library(data.table); temp &lt;- setkey(setDT(x.sub[1:2]), Var1); temp[mydf]

标签: r if-statement dataframe


【解决方案1】:

x.sub$Var1 是一个 factor 列。因此,当我们执行ifelse 时,我们会得到因子的数字levels。在ifelse 中将x.sub$Var1 替换为as.character(x.sub$Var1)

 mydf$lev_dist <- ifelse(mydf$words == as.character(x.sub$Var1)),
                        x.sub$lev_dist,0)

如果列属于character 类,则可以避免这种情况。在read.csv/read.tabledata.frame 中使用stringsAsFactors=FALSE 将确保所有字符列都属于character 类。

【讨论】:

    【解决方案2】:

    你也可以使用merge:

    x.sub = setNames(x.sub,c('lev_dist','words','Var2'))
    
    df_ = merge(df, x.sub[,1:2], by='words', all=T)
    df_[is.na(df_)]=0
    
    # >df_
    #    words number lev_dist
    #1     end      5        0
    #2      it      1        0
    #3 LTD QTY      4        1
    #4      of      6        0
    #5     the      3        0
    #6     was      2        0
    #7  winter      7        0
    

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 2012-03-04
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多