Как я могу преобразовать этот длинный формат данных в широкий формат?

Использование оператора == ( Равенство )

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

Использование оператора === ( Идентичность )

true === 1; //false
"2" === 2;  //false

Это связано с тем, что оператор равенства == имеет тип принуждения, что означает, что интерпретатор неявно пытается преобразовать значения перед сравнением.

С другой стороны, тождественный оператор === не прибегать к типу принуждения и, таким образом, не преобразует значения при сравнении.

0
задан jay.sf 24 March 2019 в 06:47
поделиться

2 ответа

Этого можно достичь с помощью подхода gather - unite - spread

df %>%
    group_by(Respondent) %>%
    gather(k, v, CS, Imp) %>%
    unite(col, Question, k, sep = "") %>%
    spread(col, v)
#  Respondent LOS Type Hotel          Q1CS Q1Imp      Q2CS    Q2Imp
#1          1  12  SML   ABC Fully Applied  High Optimized Critical

Пример данных

df <- read.table(text =
    "      Respondent  Question      CS             Imp     LOS  Type  Hotel
1          1       Q1       'Fully Applied'     High     12   SML   ABC
2          1       Q2       'Optimized'         Critical 12   SML   ABC", header = T)
0
ответ дан Maurits Evers 24 March 2019 в 06:47
поделиться

В data.table это можно сделать в одну строку ....

dcast(DT, Respondent ~ Question, value.var = c("CS", "Imp"), sep = "")[DT, `:=`(LOS = i.LOS, Type = i.Type, Hotel = i.Hotel), on = "Respondent"][]
   Respondent          CSQ1      CSQ2 ImpQ1    ImpQ2 LOS Type Hotel
1:          1 Fully Applied Optimized  High Critical  12  SML   ABC

объяснено шаг за шагом

создание выборочных данных

DT <- fread("Respondent  Question      CS             Imp     LOS  Type  Hotel
             1  Q1       'Fully Applied'     High     12   SML   ABC
            1   Q2       'Optimized'         Critical 12   SML   ABC", quote = '\'')

приведение части данных в желаемом формате по запросу
имена столбцов могут быть не такими, как вы хотите ... вы всегда можете изменить их, используя setnames().

dcast(DT, Respondent ~ Question, value.var = c("CS", "Imp"), sep = "")
#    Respondent          CSQ1      CSQ2 ImpQ1    ImpQ2
# 1:          1 Fully Applied Optimized  High Critical

Затем присоединитесь по ссылке в оригинальном DT, чтобы получить остальные необходимые вам столбцы ...

result.from.dcast[DT, `:=`( LOS = i.LOS, Type = i.Type, Hotel = i.Hotel), on = "Respondent"]
0
ответ дан Wimpel 24 March 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: