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

次のようなものを書くことができます

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

ここzindex1:zindexNで、 は Z の列インデックスの範囲であり、 も同様ですAindex

于 2013-04-26T12:21:00.723 に答える
0

データの設定:

edit : すべてゼロの行を追加します。

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 に答える
0

Ben の答えがあなたが探しているもの (そして彼のサンプル データを使用している) であると仮定すると、おそらく次のようmeltに andを使用できます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 に答える