【问题标题】:Recode values based on values in other dataset根据其他数据集中的值重新编码值
【发布时间】:2023-01-19 00:11:36
【问题描述】:

我想根据另一个数据集中的值重新编码一个数据集中的值。我的总体目标是在数据框的多个列中应用recode。

数据:

df <- data.frame(
  gender=c(1,2,1,2),
  condition=c(1,1,2,2)
)
df

  gender condition
1      1         1
2      2         1
3      1         2
4      2         2

其他数据集:

codes <- data.frame(
  gender_values= c("`1`='male', `2`='female'"),
  condition_values = c("`1`='exp', `2`='control'")
)

codes

             gender_values         condition_values
1 `1`='male', `2`='female' `1`='exp', `2`='control'

试图:

df %>% 
  dplyr::mutate(
  gender= dplyr::recode(gender, cat(noquote(codes[1,"gender_values"])), .default = NA_character_)
)

`1`='male', `2`='female'  gender condition
1   <NA>         1
2   <NA>         1
3   <NA>         2
4   <NA>         2

通缉:

  gender condition
1   male       exp
2 female       exp
3   male   control
4 female   control

【问题讨论】:

  • 在你的codes中,你有c("1='male', 2='female'"),这是一个长的单一字符串。这是故意的,还是应该是两个元素(1="male" 和2="female")?比如c("1='male'", "2='female'")?
  • 你确定代码有这种奇怪的形式吗?为什么不记录形式(即 variable_name,variable_vaule,variable_text?或宽形式?最直接的解决方案是使用连接将“重新编码”值绑定到数字......
  • @jpsmith 我打算使用一个长字符串,以便重新编码可以使用这些值。出于某种原因,recode 没有像 recode(gender, 1="male"...) 那样使用值。
  • @dario 我相信它不会,因为我的数据集的值标签在每个变量的一个单元格中。

标签: r dplyr


【解决方案1】:

如果你想使用dplyr::recode,你可以利用拼接运算符!!!来帮助解决codes中的值。如果您简化 codes 数据,它会有所帮助:

codes <- data.frame(
  gender_values = c("male", "female"),
  condition_values = c("exp", "control")
)

然后,例如,在单个列上,您可以执行以下操作:

dplyr::recode(df$gender, !!!codes$gender_values)
# [1] "male"   "female" "male"   "female"

给定示例数据,跨列应用它的一种方法是使用sapply:

sapply(names(df), function(x) dplyr::recode(df[,x], !!!codes[,paste0(x, "_values")]))

#      gender   condition
# [1,] "male"   "exp"    
# [2,] "female" "exp"    
# [3,] "male"   "control"
# [4,] "female" "control"

(请注意,此特定示例假设变量“x”(在df 中)的codes 中的所有列名称均为“x_values”,如您的示例数据所示)

【讨论】:

    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多