У меня есть довольно уродливые данные, которые нужно привести в порядок, и мне нужна помощь! Как сейчас выглядят мои данные:
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. Создайте новую переменную с именем "страна", получив имя столбца (столбцов), которое НЕ является НПД для каждой строки.
Я перепробовал МНОГО экспериментов с 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, но мы очень ценим любую помощь!