forループで簡単に解決できる質問があります。しかし、データフレームに数十万行があるので、これには非常に長い計算時間がかかるため、私は迅速でスマートなソリューションを探しています。各行に対して、セル内の別の値と一致する列名の値を抽出します。
私のデータフレームの行ごとに、Iは、列名の最初の列(INDEX)からの1つに一致するセルの値を貼り付けたい
データフレームは、この
> mydata
INDEX 1 2 3 4 5 6
1 2 18.9 9.5 22.6 4.7 16.2 7.4
2 2 18.9 9.5 22.6 4.7 16.2 7.4
3 2 18.9 9.5 22.6 4.7 16.2 7.4
4 4 18.9 9.5 22.6 4.7 16.2 7.4
5 4 18.9 9.5 22.6 4.7 16.2 7.4
6 5 18.9 9.5 22.6 4.7 16.2 7.4
ように見えます
mydata <- data.frame(INDEX=c(2,2,2,4,4,5), ONE=(rep(18.9,6)), TWO=(rep(9.5,6)),
THREE=(rep(22.6,6)), FOUR=(rep(4.7,6)), FIVE=(rep(16.2,6)), SIX=(rep(7.4,6)))
colnames(mydata) <- c("INDEX",1,2,3,4,5,6)
そして、これは、新たに計算された変数を使用して新しいデータフレームである:ここではそれを再生するためのコードです
> new_mydf
INDEX 1 2 3 4 5 6 VARIABLE
3 2 18.9 9.5 22.6 4.7 16.2 7.4 9.5
2 2 18.9 9.5 22.6 4.7 16.2 7.4 9.5
1 2 18.9 9.5 22.6 4.7 16.2 7.4 9.5
5 4 18.9 9.5 22.6 4.7 16.2 7.4 4.7
4 4 18.9 9.5 22.6 4.7 16.2 7.4 4.7
6 5 18.9 9.5 22.6 4.7 16.2 7.4 16.2
ループがにあるように私は、それはここで、以下のforループ使用して、私は上記に書いたように、私は(多分dplyr、または他の機能のようなパッケージを使用して?)もっと簡単な解決策を探しています解決
mydata$VARIABLE<-apply(mydata, 1, function(x) { x[names(x)==x[names(x)=="INDEX"]] })
編集:あなたのループに基づいて、私の拡張データセット
id = mydata$INDEX
new_mydf <- data.frame()
for (i in 1:length(id)) {
mydata_row <- mydata[i,]
value <- mydata_row$INDEX
mydata_row["VARIABLE"] <- mydata_row[,names(mydata_row) == value]
new_mydf <- rbind(mydata_row,new_mydf)
}
new_mydf <- new_mydf[ order(new_mydf[,1]), ]
が、このあります: http://stackoverflow.com/q/33310179/ – Frank
ありがとうございます、data.tableのソリューションもうまくいきます! – refroll