如何解决使用 dplyr 和 mutate 解码表的漂亮解决方案
亲爱的 dplyr/tidyverse 伙伴,我正在寻找解决以下问题的好方法。我只在带有循环的基础 R 中获得我的解决方案。你如何在 tidyverse 中干净地解决这个问题?
- 我有一个名为 data 的数据集,它没有有用的列名和没有用的值(整数)。
data <- tibble(var1 = rep(c(1:3),2),var2 = rep(c(1:3),2))
# A tibble: 6 x 2
var1 var2
<int> <int>
1 1 1
2 2 2
3 3 3
4 1 1
5 2 2
6 3 3
- 另外我有一个编码表,其中每一列都有一个更好的名称 (var1 -> variable1) 和一个更好的值 (1 -> "a")
coding <- tibble(variable = c(rep("var1",3),rep("var2",3)),name = c(rep("variable1",rep("variable2",code = rep(c(1:3),value = rep(c("a","b","c"),2))
# A tibble: 6 x 4
variable name code value
<chr> <chr> <int> <chr>
1 var1 variable1 1 a
2 var1 variable1 2 b
3 var1 variable1 3 c
4 var2 variable2 1 a
5 var2 variable2 2 b
6 var2 variable2 3 c
- 我正在寻找一个结果,该结果已将列的名称和实际值转换为数据集中的因子,比较:
result <- tibble(variable1 = factor(rep(c("a",2)),variable2 = factor(rep(c("a",2)))
# A tibble: 6 x 2
variable1 variable2
<fct> <fct>
1 a a
2 b b
3 c c
4 a a
5 b b
6 c c
感谢您的承诺:) :) :) :)
解决方法
任意列数的通用解决方案 -
- 创建一个行号列来标识每一行
- 以长格式获取
data
- 为每个值加入
coding
- 仅保留唯一的行并以宽格式恢复。
library(dplyr)
library(tidyr)
data %>%
mutate(row = row_number()) %>%
pivot_longer(cols = -row,values_to = 'code') %>%
left_join(coding,by = 'code') %>%
select(row,name = name.y,value) %>%
distinct() %>%
pivot_wider() %>%
select(-row)
# variable1 variable2
# <chr> <chr>
#1 a a
#2 b b
#3 c c
#4 a a
#5 b b
#6 c c
,
library(dplyr)
library(tidyr)
data %>%
stack() %>%
left_join(coding,by = c(ind = "variable",values = "code")) %>%
group_by(name) %>%
mutate(j = row_number()) %>%
pivot_wider(id_cols = j,values_from = value) %>%
select(-j)
# # A tibble: 6 x 2
# variable1 variable2
# <chr> <chr>
# 1 a a
# 2 b b
# 3 c c
# 4 a a
# 5 b b
# 6 c c
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。