将列切换到data.frame中的行

时间:2013-04-26 08:43:53

标签: r dataframe transformation

我遇到了一个R问题,这看起来有点棘手。我有一个看起来像这样的data.frame:

Ident | A1 | ... | An | Z1 | ... | Zn
1     | 1  | ... | 1  | 1  | ... | 0
2     | 6  | ... | 4  | 0  | ... | 1
3     | 4  | ... | 4  | 1  | ... | 0
4     | 1  | ... | 4  | 0  | ... | 0

现在,我想要的是将原始data.frame转换为以下结构:

Z     | A1 | ... | An
Z1    | 1  | ... | 1
Zn    | 6  | ... | 4
Z1    | 4  | ... | 4

如果行Z中的任何行为1,则仅将行带入结果数据。

有什么建议吗?起点可能就足够了。 非常感谢提前。

这里是转储:

structure(list(Ident = c(1, 2, 3, 4), A1 = c(1, 6, 4, 1), A2 = c(1, 
4, 4, 4), Z1 = c(1, 0, 1, 0), Z2 = c(0, 1, 0, 0)), .Names = c("Ident", 
"A1", "A2", "Z1", "Z2"), row.names = c(NA, -4L), class = "data.frame")

3 个答案:

答案 0 :(得分:0)

你可以写点像

dframe<-dframe[sum(dframe[,zindex1:zindexN])>0,Aindex1:AindexN]

其中zindex1:zindexN是Z的列索引范围,Aindex的列索引类似。

答案 1 :(得分:0)

设置数据:

编辑:添加一个全零行。

dat <- structure(list(Ident = c(1, 2, 3, 4, 5), 
      A1 = c(1, 6, 4, 1, 2), A2 = c(1, 4, 4, 4, 3), 
      Z1 = c(1, 0, 1, 1, 0), Z2 = c(0, 1, 0, 0, 0)),
     .Names = c("Ident", "A1", "A2", "Z1", "Z2"), 
    row.names = c(NA, -5L), class = "data.frame")

找出哪些列具有Z元素:

Zcols <- grep("^Z[0-9]+",names(dat))

拉出他们的名字:

Znames <- names(dat)[Zcols]

确定相关列并获取相应的名称:

w <- apply(dat[Zcols],1,
           function(x) if (all(x==0)) NA else which(x==1))
dd <- data.frame(Z=Znames[w], dat[-Zcols])

如果您愿意,可以转换NA值:

levels(dd$Z) <- c(levels(dd$Z),"missing")
dd$Z[is.na(dd$Z)] <- "missing"

##         Z Ident A1 A2
## 1      Z1     1  1  1
## 2      Z2     2  6  4
## 3      Z1     3  4  4
## 4      Z1     4  1  4
## 5 missing     5  2  3

答案 2 :(得分:0)

假设Ben的答案是您正在寻找的(并使用他的示例数据),也许您可​​以使用meltmerge,如下所示:

library(reshape2)
zCols <- grep("^Z", names(dat), value = TRUE)  ## Just the Z cols
otherCols <- setdiff(names(dat), zCols)        ## The other columns
datL <- melt(dat, measure.vars = zCols)        ## melting
merge(dat[otherCols],                          ## merging
      datL[as.logical(datL$value), c(otherCols, "variable")],
      all = TRUE)
#   Ident A1 A2 variable
# 1     1  1  1       Z1
# 2     2  6  4       Z2
# 3     3  4  4       Z1
# 4     4  1  4       Z1
# 5     5  2  3     <NA>