我遇到了一个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")
答案 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的答案是您正在寻找的(并使用他的示例数据),也许您可以使用melt
和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>