【问题标题】:Replace value from other dataframe替换其他数据框中的值
【发布时间】:2016-08-18 11:03:05
【问题描述】:

我有一个数据框 (x),其中包含一个因子变量,其值用逗号分隔。我有另一个数据框(y),其中包含相同值的描述。现在我想用数据框 (y) 中的描述替换数据框 (x) 中的值。任何帮助将不胜感激。

比如说,两个数据框如下所示

data frame (x)
    s.no    x
    1       2,5,45
    2       35,5
    3       45

data fram (y)
s.no    x   description
1       2      a
2       5      b
3       45     c
4       35     d

我需要如下输出

s.no    x
1      a,b,c
2      d,b
c       c

【问题讨论】:

    标签: r replace dplyr


    【解决方案1】:

    splitstackshape:

    library(splitstackshape)
    
    cSplit(x, 'x', ',', 'long')[setDT(y), on='x'][,.(x=paste(description, collapse=',')), s.no]
    
    #   s.no     x
    #1:    1 a,b,c
    #2:    2   b,d
    #3:    3     c
    

    【讨论】:

    • 使用splitstackshape-package时,不一定要使用setDT
    【解决方案2】:

    使用dplyrtidyr 的解决方案:

    library(dplyr)
    library(tidyr)
    x %>% 
      separate(x, paste0('x',1:3),',',convert=TRUE) %>% 
      gather(var, x, -1, na.rm=TRUE) %>% 
      left_join(., y, by='x') %>% 
      group_by(s.no = s.no.x) %>% 
      summarise(x = paste(description,collapse = ','))
    

    结果:

       s.no     x
      (int) (chr)
    1     1 a,b,c
    2     2   d,b
    3     3     c
    

    【讨论】:

    • 您知道您发布的内容只是我的解决方案的复制粘贴吗?
    • @ColonelBeauvel 直到我发布后才看到它。我删除了cSplit 解决方案。
    • dplyr 的好解决方案,+1
    【解决方案3】:

    我们可以通过','split'x'数据集中的'x'列,循环遍历list,将值与'y'中的'x'列匹配得到数字索引,得到来自 'y' 和 paste 的对应的 'description' 值一起。

    x$x <- sapply(strsplit(x$x, ","), function(z) 
               toString(y$description[match(as.numeric(z), y$x)]))
    
    x
    #  s.no       x
    #1    1 a, b, c
    #2    2    d, b
    #3    3       c
    

    注意:如果 'x' 中的 'x' 列是 factor 类,请使用 strsplit(as.character(x$x, ","))

    【讨论】:

    • 抱歉,没看到你。删除了我的,因为它非常相似。没人见过你...你就像一个忍者 :)
    • @Sotos 没问题。您可以通过mgsub 或类似的方式提出另一个想法
    • @akrun 因为变量是因子,所以我添加了 as.character ,它会抛出一个错误,提示“split is missing with no default”。但是如果我在应用函数之前将因子转换为字符,它会很好地工作并且我得到了我的更新。如果我错了,请纠正我。非常感谢您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多