下面是一個使用從 「reshape2」 melt
和cSplit
從我的 「splitstackshape」 包一些 「data.table」 好玩一起的方法。我已經加載了dplyr
,這樣我們就可以管好所有的東西。
library(splitstackshape)
library(reshape2)
library(dplyr)
mydf %>%
as.data.table(keep.rownames = TRUE) %>% # Convert to data.table. Keep rownames
melt(id.vars = "rn", variable.name = "V") %>% # Melt the dataset by rownames
.[value > 0] %>% # Subset for all non-zero values
cSplit("V", ".") %>% # Split the "V" column (names) by "."
.[is.na(V_2), V_2 := value] %>% # Replace NA values with actual values
dcast.data.table(rn ~ V_1, value.var = "V_2") # Go wide.
# rn Q1 Q2 Q3
# 1: 1 1 3 2
# 2: 2 2 4 1
# 3: 3 3 2 2
這裏是一個可能的基礎R方法:
## Which columns are binary?
Bins <- sapply(mydf, function(x) {
all(x %in% c(0, 1))
})
## Two vectors -- part after the dot and before
X <- gsub(".*\\.(.*)$", "\\1", names(mydf)[Bins])
Y <- unique(gsub("(.*)\\..*$", "\\1", names(mydf)[Bins]))
## Use `apply` to subset the X value based on the
## logical version of the binary variable
cbind(mydf[!Bins],
`colnames<-`(t(apply(mydf[Bins], 1, function(z) {
X[as.logical(z)]
})), Y))
# Q2 Q1 Q3
# 1 3 1 2
# 2 4 2 1
# 3 2 3 2
最後,你可以重新排序的列必需的。您可能還需要將它們轉換爲數字,因爲在這種情況下,Q1和Q3將是因素。
應該'Q3'是'2,1,3' – akrun 2015-03-02 16:34:08
@akrun:不要這麼認爲 - 有3個問題,Q1和Q3是空置的。 Q1有1,2,3級; Q3有1,2級。 – screechOwl 2015-03-02 16:36:24
好的,我在考慮'1'的位置 – akrun 2015-03-02 16:37:51