1

我遇到了一个 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")
4

3 回答 3

0

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

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>
于 2014-09-12T17:01:43.953 回答
0

你可以写类似

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

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

于 2013-04-26T12:21:00.723 回答
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
于 2013-04-26T12:22:28.303 回答