我在替换数据框的列中的值时遇到一些问题。
我有两个看起来像这样的数据框:
结果表:
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$r
和m$id
中的数字,其中最难的部分是我可以显示多个数字。
示例:元组“ 100,111”,“ 3,6,7”最后应为“ tc6,tc7”,“ tc1,tc2,tc3”。
任何帮助将不胜感激。
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
这是使用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