Mam zestaw danych pomiarowych w szerokiej formie. W przypadku konkretnego pytania zestaw zmiennych został utworzony w surowych danych, aby przedstawić inny fakt, że pytanie ankiety zostało zadane w danym miesiącu.Wykonywanie operacji na podzbiorze za pomocą tabeli danych
Chcę utworzyć nowy zestaw zmiennych, które mają nazwy niezmienne od miesiąca; wartość tych zmiennych będzie odpowiadać wartości pytania miesięcznego dla obserwowanego miesiąca.
proszę zobaczyć przykładową/fikcyjne zestaw danych:
require(data.table)
data <- data.table(month = rep(c('may', 'jun', 'jul'), each = 5),
may.q1 = rep(c('yes', 'no', 'yes'), each = 5),
jun.q1 = rep(c('breakfast', 'lunch', 'dinner'), each = 5),
jul.q1 = rep(c('oranges', 'apples', 'oranges'), each = 5),
may.q2 = rep(c('econ', 'math', 'science'), each = 5),
jun.q2 = rep(c('sunny', 'foggy', 'cloudy'), each = 5),
jul.q2 = rep(c('no rain', 'light mist', 'heavy rain'), each = 5))
W tym badaniu, istnieją naprawdę tylko dwa pytania: "Q1" i "Q2". Każde z tych pytań jest wielokrotnie zadawane przez kilka miesięcy. Jednak obserwacja zawiera poprawną odpowiedź tylko wtedy, gdy miesiąc obserwowany w danych jest zgodny z pytaniem ankiety w danym miesiącu.
Na przykład: "may.q1" jest obserwowane jako "tak" dla każdej obserwacji w "Maj". Chciałbym, aby nowa zmienna "Q1" reprezentowała "may.q1", "jun.q1" i "jul.q1". Wartość "Q1" przyjmie wartość "may.q1", gdy miesiąc jest "may", a wartość "Q1" przyjmie wartość "jun.q1", gdy miesiąc to "jun" .
Gdybym miał spróbować i zrobić to ręcznie za pomocą tabeli danych, chciałbym coś takiego:
mdata <- data[month == 'may', c('month', 'may.q1', 'may.q2'), with = F]
setnames(mdata, names(mdata), gsub('may\\.', '', names(mdata)))
Chciałbym żeby to powtórzył „za = miesiąc”.
Gdybym miał użyć pakietu „plyr” dla ramki danych, chciałbym rozwiązać stosując następujące podejście:
require(plyr)
data <- data.frame(data)
mdata <- ddply(data, .(month), function(dfmo) {
dfmo <- dfmo[, c(1, grep(dfmo$month[1], names(dfmo)))]
names(dfmo) <- gsub(paste0(dfmo$month[1], '\\.'), '', names(dfmo))
return(dfmo)
})
Każda pomoc stosując metodę data.table byłoby bardzo mile widziane, jako moich danych Są duże. Dziękuję Ci.
Oh wow .. I nie odczuwało myślę o tym! niesamowite. – Arun
MatthewDowle, to * zdecydowanie * szybciej niż (my) stopić i rzucić. Wypróbowałem to na większych danych. Mój nie jest tak blisko ... Zajmuje 23 sekundy na 1e5 * 100 kolumnach, podczas gdy robi to w mniej niż sekundę! – Arun