【发布时间】:2024-01-01 11:25:01
【问题描述】:
我有一些相当难看的数据需要整理,需要帮助!我的数据现在是什么样子的:
countries <- c("Austria", "Belgium", "Croatia")
df <- tibble("age" = c(28,42,19, 67),
"1_recreate_1"=c(NA,15,NA,NA),
"1_recreate_2"=c(NA,10,NA,NA),
"1_recreate_3"=c(NA,8,NA,NA),
"1_recreate_4"=c(NA,4,NA,NA),
"1_fairness" = c(NA, 7, NA, NA),
"1_confidence" = c(NA, 5, NA, NA),
"2_recreate_1"=c(29,NA,NA,30),
"2_recreate_2"=c(20,NA,NA,24),
"2_recreate_3"=c(15,NA,NA,15),
"2_recreate_4"=c(11,NA,NA,9),
"2_fairness" = c(4, NA, NA, 1),
"2_confidence" = c(5, NA, NA, 4),
"3_recreate_1"=c(NA,NA,50,NA),
"3_recreate_2"=c(NA,NA,40,NA),
"3_recreate_3"=c(NA,NA,30,NA),
"3_recreate_4"=c(NA,NA,20,NA),
"3_fairness" = c(NA, NA, 2, NA),
"3_confidence" = c(NA, NA, 2, NA),
"overall" = c(3,3,2,5))
我需要它们最终的样子(硬编码):
df <- tibble(age = rep(c(28,42,19,67), each=4),
country = rep(c("Belgium", "Austria", "Croatia", "Belgium"), each=4),
recreate = rep(1:4, times=4),
fairness = rep(c(4,7,2,1), each=4),
confidence = rep(c(5,5,2,4), each=4),
allocation = c(29, 20, 15, 11,
15, 10, 8, 4,
50, 40, 30, 20,
30, 24, 15, 9),
overall = rep(c(3,3,2,5), each=4))
到达那里的步骤(我想!):
1.使用我的国家/地区列表替换这些列的起始数字。
开始字符串的数字是countries 中的索引。换句话说,16_recreate_1 将对应于向量countries 中的第 16 个国家/地区。我认为以下代码有效(虽然不确定它是否完全正确):
for(i in length(countries):1){
colnames(df) <- str_replace(colnames(df), paste0(i,"_"), paste0(countries[i],"_"))
}
2。通过获取每行的非 NA 列的名称来创建一个名为“country”的新变量。
我对@987654327@ 和names 进行了一系列实验,但无法完全发挥作用。
3.创建新变量 (recreate_1...recreate_4) 以获取每一行的 [country_name]_recreate_1...[country_name]_recreate_4 值,无论该人的国家/地区是非 NA。
也许rowSums 是这样做的方法?
4.使数据长而不是宽
我认为这将需要gather,但我不确定如何仅从变量country 和recreate_1...recreate_4 中收集。
很抱歉,这太复杂了。 Tidyverse 解决方案是首选,但非常感谢任何帮助!
【问题讨论】:
-
糟糕!对此感到抱歉--已更新。