应用 returns 矩阵而不是字符向量

sapply returns a matrix instead of character vector

我有以下数据:

df_1 <- data.frame(var =  c("A_new_1",  "B_new_2",  "A_old_1",  "B_old_2"), 
code = 001, desc = c('applied', 'not applied', 'applied','applied'))
> df_1
      var code        desc
1 A_new_1    1     applied
2 B_new_2    1 not applied
3 A_old_1    1     applied
4 B_old_2    1     applied

我想用1_new_A替换A_new_1,依此类推。我想使用 dplyr 并一次全部替换,这是我尝试过的:

p <- list(c('1_new_A'), c('2_new_B'), c('1_old_A'), c('2_old_B'))

ptr <- list(c('A_new_1'), c('B_new_2'), c('A_old_1'), c('B_old_2'))

df_1 %>% mutate(var  = (sapply(1:4, function(i){ gsub(ptr[[i]], p[[i]], var)})))

这是我得到的:

    var.1   var.2   var.3   var.4 code        desc
1 1_new_A A_new_1 A_new_1 A_new_1    1     applied
2 B_new_2 B_new_2 B_new_2 B_new_2    1 not applied
3 A_old_1 A_old_1 A_old_1 A_old_1    1     applied
4 B_old_2 B_old_2 B_old_2 2_old_B    1     applied

我的问题:

  1. 为什么应用 return 矩阵?
  2. 如何更正上述解决方案和 return 输入数据帧中的单个字符向量 (var)?

这可能更简单。首先修正你的例子:

p <- c('1_new_A', '2_new_B', '1_old_A', '2_old_B')
ptr <- c('A_new_1', 'B_new_2', 'A_old_1', 'B_old_2') # Fixing typos
df_1$var <- p[match(df_1$var, ptr)]
df_1
#       var code        desc
# 1 1_new_A    1     applied
# 2 2_new_B    1 not applied
# 3 1_old_A    1     applied
# 4 2_old_B    1     applied

或在 dplyr 中:

df_1 %>% mutate(var=p[match(var, ptr)])
#       var code        desc
# 1 1_new_A    1     applied
# 2 2_new_B    1 not applied
# 3 1_old_A    1     applied
# 4 2_old_B    1     applied

使用 dplyr 的更好选择可能是 recode() 函数。例如

translate <- setNames(unlist(p), unlist(ptr))
df_1 %>% mutate(var  = recode(var, !!!translate ))

基本上您只需要为翻译创建一个命名列表,然后将其注入 recode().

sapply() 是一个矩阵 return 因为你在值 1:4 上循环,所以每个数字 1 到 4 的值都是 return,你正在使用 gsub()var,在 mutate() 中,var 的值是整列值。因此,每次调用 gsub 时,您都会 return 计算多个值,因此它会转换为矩阵。