Dataframe неправильно изменяет форму

У меня есть следующий фреймворк:

  Variables Varcode  Country Ccode  2000  2001 
1 Power     P        France  FR     1213  1234
2 Happiness H        France  FR     1872  2345
3 Power     P        UK      UK     1726  6433
4 Happiness H        UK      UK     2234  9082

I would like to reshape this dataframe as follows:

  Year      Country Ccode P(label=Power) H(label=Happiness)
1 2000      France  FR    1213          1872  
2 2001      France  FR    1234          2345
3 2000      UK      UK    1726          2234
4 2001      UK      UK    6433          9082

Исходный код был следующим:

library(tidyverse)
df %>%
    gather(Year, val, -Variables, -Country) %>%
    spread(Variables, val)

Я попытался расширить код, потому что Ccode и Indicator Code оказались строкой в ​​списке, и я решил, что хочу использовать коды как имена переменных, а имена переменных как метки (обратите внимание, что из-за этого я поменял местами -Variables и Variables с -Varcode и Varcode соответственно):

library(tidyverse)
library(Hmisc)
List <- df$Variables
df<-df %>%
    gather(Year, val, -Varcode, -Country) %>%
    spread(Varcode, val)
for(i in List){
label(df[,i]) <- List[i]
}

Обратите внимание: я использую список из-за ограничений памяти.

Я столкнулся с двумя проблемами:

  1. Преобразование не проходит гладко, потому что два дополнительных столбца из df (среди которых Variables) добавляются туда, где должны быть значения.
  2. Функция метки выдает ошибку.

Может ли кто-нибудь помочь мне разобраться, что идет не так?


person Tom    schedule 03.08.2018    source источник


Ответы (1)


Я думаю, вы ошиблись с выбором столбцов для сбора

Данные:

df <- read.table(text = "Variables Varcode  Country  2000  2001 
1 Power     P        France   1213  1234
2 Happiness H        France   1872  2345
3 Power     P        UK       1726  6433
4 Happiness H        UK       2234  9082", header = TRUE, stringsAsFactors = FALSE) %>% 
  rename(`2000` = X2000, `2001` = X2001)

df %>% 
  select(-Varcode) %>% 
  gather(Year, val,`2000`:`2001`) %>% 
  unite(Country_Ccode, Country, Ccode, sep = "_") %>% 
  spread(Variables, val) %>% 
  separate(Country_Ccode, c("Country", "Ccode"), sep = "_")

Выход

  Country Ccode Year Happiness Power
1  France    FR 2000      1872  1213
2  France    FR 2001      2345  1234
3      UK    UK 2000      2234  1726
4      UK    UK 2001      9082  6433
person Jack Brookes    schedule 03.08.2018
comment
Кажется, что код действительно работал, но в предыдущем коде была аналогичная проблема. Буду обновлять проблему. Может быть, вы могли бы взглянуть еще раз? Также часть списка / метки на самом деле не работает. - person Tom; 03.08.2018
comment
Я не понимаю, чего вы пытаетесь достичь, пожалуйста, добавьте, как должен выглядеть фреймворк в конце - person Jack Brookes; 03.08.2018
comment
Я сделал это в своей редакции. Моя ошибка заключалась в том, что я не показал полный фреймворк, приношу свои извинения. - person Tom; 03.08.2018
comment
Смотрите обновление. Что вам нужно в label? Я полагаю, что это не работает для имен столбцов. - person Jack Brookes; 03.08.2018
comment
Фактический набор данных содержит около 1540 переменных с наихудшими названиями индикаторов (очень длинными) и кодами (непонятно). Идея заключалась бы в том, что я могу использовать коды индикаторов для ссылки на переменную, при этом не теряя понимания, о чем я говорю. - person Tom; 03.08.2018
comment
Итак, я прошел часть 1, большое спасибо! Есть какие-нибудь подсказки, как исправить проблему с этикеткой? - person Tom; 03.08.2018
comment
Поскольку это другой вопрос, вам следует задать отдельный вопрос. Но я бы использовал Varcode во время анализа, а затем имел бы что-то вроде именованного списка, который сопоставляет Varcode с исходными переменными, если вам нужно их найти (по какой-либо причине) - person Jack Brookes; 03.08.2018