在R语言中基于名称值重塑多列数据的技术咨询
解决方案
可以使用tidyverse工具包完成数据整理,步骤如下:
1. 加载依赖包
首先加载处理数据所需的工具包:
library(tidyverse)
2. 提取排名(ranks)数据
将原数据中prop1/prop2与对应的prop1_rank/prop2_rank转换为长格式,过滤缺失值并重命名列:
rank_data <- Df %>% select(prop1, prop1_rank, prop2, prop2_rank) %>% pivot_longer( cols = everything(), names_to = c("group", ".value"), names_pattern = "(prop\\d)_(.*)" ) %>% filter(!is.na(prop)) %>% rename(propositions = prop, ranks = rank) %>% select(-group)
3. 提取频率(freqs)数据
处理initOSF1/initOSF2与对应频率列,同时对重复的类别去重(同一类别的频率值一致):
freq_data <- Df %>% select(initOSF1, initOSF1_freq, initOSF2, initOSF2_freq) %>% pivot_longer( cols = everything(), names_to = c("group", ".value"), names_pattern = "(initOSF\\d)_(.*)" ) %>% filter(!is.na(initOSF)) %>% rename(propositions = initOSF, freqs = freq) %>% select(-group) %>% distinct(propositions, .keep_all = TRUE)
4. 合并数据得到最终结果
将排名数据与频率数据按类别关联,得到目标三列数据框:
final_df <- rank_data %>% left_join(freq_data, by = "propositions") %>% arrange(propositions)
执行后得到的结果如下:
> final_df propositions ranks freqs 1 French 0 66 2 French 40 66 3 Rock 1 14 4 Rock 2 14 5 Pop 1 14 6 Pop 2 14 7 Spanish 10 0 8 Spanish 1 0 9 -19 to -10 4 6 10 -19 to -10 0 6 11 -29 to -20 11 0 12 -29 to -20 0 0
内容的提问来源于stack exchange,提问作者Hanbin Go
相关产品推荐
相关产品推荐

