下面是一个使用从 “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