【问题标题】:Match values in data frame with values in another data frame and replace former with a corresponding pattern from the other data frame将数据帧中的值与另一个数据帧中的值匹配,并将前者替换为来自另一个数据帧的相应模式
【发布时间】:2021-05-22 02:35:14
【问题描述】:

复杂的标题,但这是我想要实现的一个简单示例:

d <- data.frame(v1 = c(1,2,3,4,5,6,7,8), 
                v2 = c("A","E","C","B","B","C","A","E"))

m <- data.frame(v3 = c("D","E","A","C","D","B"), 
                v4 = c("d","e","a","c","d","b"))

d$v2 中的值应替换为 m$v4 中的值,方法是匹配 d$v2m$v3 中的值

生成的数据框d 应如下所示:

v1    v4
1      a
2      e
3      c
4      b
5      b
6      c
7      a
8      e

我尝试了不同的东西,最接近的是:d$v2 &lt;- m$v4[which(m$v3 %in% d$v2)]

我再次尝试避免任何 for 循环!必须有可能:-) 不知何故... ;)

【问题讨论】:

    标签: r replace pattern-matching dataframe


    【解决方案1】:

    这将为您提供所需的输出:

    d$v2 <- m$v4[match(d$v2, m$v3)]
    

    match 函数从 m 矩阵的 v3 列返回 d$v2 中被匹配的值的位置。获得索引后(通过使用 match()),使用这些索引访问来自 m$v4 的元素以替换 d 矩阵第 v2 列中的元素。

    【讨论】:

      【解决方案2】:

      您可以使用标准的左连接。

      加载数据:

      d <- data.frame(v1 = c(1,2,3,4,5,6,7,8), v2 = c("A","E","C","B","B","C","A","E"), stringsAsFactors=F)
      m <- data.frame(v3 = c("D","E","A","C","D","B"), v4 = c("d","e","a","c","d","b"), stringsAsFactors=F)
      

      更改列名,以便我可以按列“v2”加入

      colnames(m) <- c("v2", "v4")
      

      左加入并保持data.frame d的顺序

      library(dplyr)
      left_join(d, m)
      

      输出:

        v1 v2 v4
      1  1  A  a
      2  2  E  e
      3  3  C  c
      4  4  B  b
      5  5  B  b
      6  6  C  c
      7  7  A  a
      8  8  E  e
      

      【讨论】:

        【解决方案3】:

        你可以试试:

        merge(d,m, by.x="v2", by.y="v3")
          v2 v1 v4
        1  A  1  a
        2  A  7  a
        3  B  4  b
        4  B  5  b
        5  C  3  c
        6  C  6  c
        7  E  2  e
        8  E  8  e
        

        编辑

        这是另一种保持顺序的方法:

        data.frame(v1=d$v1, v4=m[match(d$v2, m$v3), 2])
          v1 v4
        1  1  a
        2  2  e
        3  3  c
        4  4  b
        5  5  b
        6  6  c
        7  7  a
        8  8  e
        

        【讨论】:

        • 我尝试了合并,但它改变了顺序,我想保持数据框 d 的顺序。当然可以先在 d 中添加一列“订单”,然后在该列上应用合并手段之后,但我需要再次删除它。我想这有点过头了,不是吗?
        • 是的,匹配就可以了!极好的。其余的很容易理解。有很多这样的东西,比如matchwhich%in%is.element等等,还有很多组合,有时很难找到合适的..嗯:)
        • johannes 的第二个解决方案奏效了,不是我想要的,但比合并更好。
        猜你喜欢
        • 2021-08-02
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 2016-07-24
        • 2018-05-03
        相关资源
        最近更新 更多