应用 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
我的问题:
- 为什么应用 return 矩阵?
- 如何更正上述解决方案和 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 计算多个值,因此它会转换为矩阵。
我有以下数据:
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
我的问题:
- 为什么应用 return 矩阵?
- 如何更正上述解决方案和 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 计算多个值,因此它会转换为矩阵。