result
水平方向に列をピボットして、列がthenで順序付けられている組み合わせごとに個別のdf
行を持つデータセットを作成し
たいと考えています。region
state
county
year
city
また、新しいデータ セットの各行を で識別し、4 つの列の間の空白を削除したいと考えregion
ていstate
ます。以下のコードはそのすべてを行っていますが、あまり効率的ではないと思います。county
results
reshape2
各グループに一意の識別子を作成し、各グループ内の観測に番号を付けずにこれを行う方法はありますか? 行列から空白を削除するために for ループの代わりに apply を使用する方法はありますか? (ここでの行列は、数学またはプログラミング構造とは異なる方法で使用されています。) これらは 2 つの別個の質問であり、各質問を個別に投稿する必要があることを認識しています。
私は望ましい結果を達成でき、コードを改善することだけを考えているので、これを投稿する必要があるかどうかはわかりませんが、学びたいと思っています. アドバイスをありがとう。
df <- read.table(text= "
region state county city year result
1 1 1 1 1 1
1 1 1 2 1 2
1 1 1 1 2 3
1 1 1 2 2 4
1 1 2 3 1 4
1 1 2 4 1 3
1 1 2 3 2 2
1 1 2 4 2 1
1 2 1 1 1 0
1 2 1 2 1 NA
1 2 1 1 2 0
1 2 1 2 2 0
1 2 2 3 1 2
1 2 2 4 1 2
1 2 2 3 2 2
1 2 2 4 2 2
2 1 1 1 1 9
2 1 1 2 1 9
2 1 1 1 2 8
2 1 1 2 2 8
2 1 2 3 1 1
2 1 2 4 1 0
2 1 2 3 2 1
2 1 2 4 2 0
2 2 1 1 1 2
2 2 1 2 1 4
2 2 1 1 2 6
2 2 1 2 2 8
2 2 2 3 1 3
2 2 2 4 1 3
2 2 2 3 2 2
2 2 2 4 2 2
", header=TRUE, na.strings=NA)
desired.result <- read.table(text= "
region state county results
1 1 1 1234
1 1 2 4321
1 2 1 0.00
1 2 2 2222
2 1 1 9988
2 1 2 1010
2 2 1 2468
2 2 2 3322
", header=TRUE, colClasses=c('numeric','numeric','numeric','character'))
# redefine variables for package reshape2 creating a unique id for each
# region, state, county combination and then number observations in
# each of those combinations
library(reshape2)
id.var <- df$region*100000 + df$state*1000 + df$county
obsnum <- sequence(rle(id.var)$lengths)
df2 <- dcast(df, region + state + county ~ obsnum, value.var = "result")
# remove spaces between columns of results matrix
# with a for-loop. How can I use apply to do this?
x <- df2[,4:(4+max(obsnum)-1)]
# use a dot to represent a missing observation
x[is.na(x)] = '.'
x.cat = numeric(nrow(x))
for(i in 1:nrow(x)) {
x.cat[i] = paste(x[i,], collapse="")
}
df3 <- cbind(df2[,1:3],x.cat)
colnames(df3) <- c("region", "state", "county", "results")
df3
df3 == desired.result
編集:
以下の Matthew Lundberg の回答は優れています。その後、上記の 4 つの結果列が数値の有理数を含み、スペースで区切られた出力データ セットも作成する必要があることに気付きました。そのため、マシューの回答を変更する明らかな方法を以下に投稿しました。これが承認されたプロトコルかどうかはわかりませんが、新しいシナリオは元の投稿に直接関連しているように見えるので、新しい質問を投稿する必要はないと思いました.