Использование оператора ==
( Равенство )
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
Это связано с тем, что оператор равенства ==
имеет тип принуждения, что означает, что интерпретатор неявно пытается преобразовать значения перед сравнением.
С другой стороны, тождественный оператор ===
не прибегать к типу принуждения и, таким образом, не преобразует значения при сравнении.
Этого можно достичь с помощью подхода 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)
В data.table это можно сделать в одну строку ....
dcast(DT, Respondent ~ Question, value.var = c("CS", "Imp"), sep = "")[DT, `:=`(LOS = i.LOS, Type = i.Type, Hotel = i.Hotel), on = "Respondent"][]
blockquote>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"]