如何在R中将值转换为列,并将列同时转换为值
我拥有排名选择投票调查的结果,该调查以以下格式提供数据:如何在R中将值转换为列,并将列同时转换为值,r,dplyr,R,Dplyr,我拥有排名选择投票调查的结果,该调查以以下格式提供数据: choice_1 choice_2 choice_3 choice_4 <chr> <chr> <chr> <chr> 1 Tuesday E… Thursday … Wednesday… Monday E… 2 Saturday … Saturday … NA NA
choice_1 choice_2 choice_3 choice_4
<chr> <chr> <chr> <chr>
1 Tuesday E… Thursday … Wednesday… Monday E…
2 Saturday … Saturday … NA NA
3 Saturday … Tuesday E… Monday Ev… Wednesda…
4 Monday Ev… Tuesday E… Saturday … Sunday M…
我知道pivot_longer和pivot_wide可以分别用于将列转换为值和将值转换为列,但这里我基本上需要同时执行这两个操作,我完全不知道我是否能够实现这一点
解决方案
我最后用这个来获取数据格式,就像选票一样:
x <- data %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = contains("Choice"),
values_drop_na = TRUE) %>%
mutate(name = str_remove_all(name, "Choice ")) %>%
pivot_wider(names_from = value, values_from = name) %>%
select(-rn) %>%
mutate_all(as.integer)
如果我们需要列名的后缀a列,请使用pivot_longer将其转换为长格式,然后在拆分“name”列后将其重塑为宽格式
library(dplyr)
library(tidyr)
library(data.table)
library(DescTools)
df1 %>%
pivot_longer(cols = everything(), values_drop_na = TRUE) %>%
separate(name, into = c('name1', 'name2'), convert = TRUE) %>%
select(-name1) %>%
arrange(match(word(value, 1), day.name)) %>%
mutate(rn = rowid(value)) %>%
pivot_wider(names_from = value, values_from = name2) %>%
select(-rn)
-输出
# A tibble: 4 x 6
# `Monday Evening` `Tuesday Evening` `Wednesday Evening` `Thursday Evening` `Saturday Evening` `Sunday Morning`
# <int> <int> <int> <int> <int> <int>
#1 4 1 3 2 1 4
#2 3 2 4 NA 2 NA
#3 1 2 NA NA 1 NA
#4 NA NA NA NA 3 NA
数据
如果我们需要列名的后缀a列,请使用pivot_longer将其转换为长格式,然后在拆分“name”列后将其重塑为宽格式
library(dplyr)
library(tidyr)
library(data.table)
library(DescTools)
df1 %>%
pivot_longer(cols = everything(), values_drop_na = TRUE) %>%
separate(name, into = c('name1', 'name2'), convert = TRUE) %>%
select(-name1) %>%
arrange(match(word(value, 1), day.name)) %>%
mutate(rn = rowid(value)) %>%
pivot_wider(names_from = value, values_from = name2) %>%
select(-rn)
-输出
# A tibble: 4 x 6
# `Monday Evening` `Tuesday Evening` `Wednesday Evening` `Thursday Evening` `Saturday Evening` `Sunday Morning`
# <int> <int> <int> <int> <int> <int>
#1 4 1 3 2 1 4
#2 3 2 4 NA 2 NA
#3 1 2 NA NA 1 NA
#4 NA NA NA NA 3 NA
数据
我意识到这实际上并不能满足我的需要,因为选项号需要与原始行对齐。不过我确实想出来了!从工作的基础上你给了我什么所以谢谢你。啊,我能理解。如果我提供了更多的数据,我需要做的事情可能会更清楚。原始数据不容易放在文章的宽度上,所以我改为缩写。我认为主要的问题是我试图做一个可能不需要的排列。@Abigail,如果你能根据我文章中的数据显示预期的输出。这将是有用的。我可以更新答案事实上我认为唯一的问题是行号需要与原始数据关联。我没有解释排名选择投票是如何计算的,这可能是误解的一部分。只知道X个数的人对给定的选择进行排名1、2、3等是不够的。这关系到每个人对选择进行排名的顺序,因此如果他们的第一个选择被排除,他们的第二个选择将在下一轮计算中使用。我意识到这实际上并没有满足我的需要,因为选项编号需要与原始行对齐。不过我确实想出来了!从工作的基础上你给了我什么所以谢谢你。啊,我能理解。如果我提供了更多的数据,我需要做的事情可能会更清楚。原始数据不容易放在文章的宽度上,所以我改为缩写。我认为主要的问题是我试图做一个可能不需要的排列。@Abigail,如果你能根据我文章中的数据显示预期的输出。这将是有用的。我可以更新答案事实上我认为唯一的问题是行号需要与原始数据关联。我没有解释排名选择投票是如何计算的,这可能是误解的一部分。仅仅知道某个给定选项的排名是X个数(1、2、3等)是不够的。这关系到每个人对选项的排名顺序,因此,如果他们的第一个选项被排除,他们的第二个选项将在下一轮计算中使用。