根据条件替换一列中的多个元素

问题描述 投票:2回答:2

我在替换数据框的列中的值时遇到一些问题。

我有两个看起来像这样的数据框:

结果表:

r <- data.frame(d = c("100", "100,111", "100,111,123"), r = c("3", "3,6,7", "42,57"))

映射表:

m <- data.frame(id = c("3", "6", "7", "42", "57", "100", "111", "123"), name= c("tc1", "tc2", "tc3", "tc4", "tc5", "tc6", "tc7", "tc8"))

现在,我希望基于m$name中的匹配项/部分匹配项,使r$d中的字符串替换r$rm$id中的数字,其中最难的部分是我可以显示多个数字。

示例:元组“ 100,111”,“ 3,6,7”最后应为“ tc6,tc7”,“ tc1,tc2,tc3”。

任何帮助将不胜感激。

r search replace
2个回答
1
投票

tidyverse方法将是获取长格式的列,基于逗号分隔行,group_by每行和每一列,并创建一个以逗号分隔的字符串。最后,我们再次获得宽格式的数据。

library(dplyr)
library(tidyr)

r %>%
  mutate(row = row_number()) %>%
  pivot_longer(cols = -row, values_to = 'id') %>%
  separate_rows(id, sep = ",", convert = TRUE)  %>%
  left_join(m %>% 
             type.convert(as.is = TRUE), by = 'id')  %>%
  group_by(row, name.x)  %>%
  summarise(name = toString(name.y)) %>%
  pivot_wider(names_from = name.x, values_from = name) %>%
  ungroup %>%
  select(-row)

# A tibble: 3 x 2
#  d             r            
#  <chr>         <chr>        
#1 tc6           tc1          
#2 tc6, tc7      tc1, tc2, tc3
#3 tc6, tc7, tc8 tc4, tc5     

0
投票

这是使用apply函数的基本R方式:

r$d <- lapply(r$d, function(x) {
    apply(m, 1, function(y) {
        x <<- gsub(paste0("\\b", y[1], "\\b"), y[2], x)
    })
    return(x)
})
r

               d     r
1         tc6     3
2     tc6,tc7 3,6,7
3 tc6,tc7,tc8 42,57
© www.soinside.com 2019 - 2024. All rights reserved.