У меня немного некрасивых данных, чтобы привести их в порядок и мне нужна помощь!Как выглядят мои данные сейчас:
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
будет соответствовать 16-й стране в векторе countries
.Я думаю, что следующий код работает (хотя я не уверен, что это правильно):
for(i in length(countries):1){
colnames(df) <- str_replace(colnames(df), paste0(i,"_"), paste0(countries[i],"_"))
}
2.Создайте новую переменную под названием «страна», получив имя столбца (столбцов), который НЕ является NA для каждой строки.
Я попробовал ПУТЬ экспериментов с which.max
и names
,но не смог получить его полностью функциональным.
3.Создайте новые переменные (recreate_1
... recreate_4
), которые получают значение [country_name]_recreate_1
... [country_name]_recreate_4
для каждой строки, независимо от того, какая страна не является NA для этого человека.
Может быть, rowSums
это способ сделать это?
4.Увеличьте длину данных вместо широких Я думаю, что для этого потребуется gather
, но я не уверен, как собрать только переменные country
и recreate_1
... recreate_4
.
Мне очень жаль, что это так сложно.Tidyverse решения предпочтительнее, но любая помощь очень приветствуется!