0

私は次のようなデータセットを持っています:

id   region
 1     2
 1     3
 2     1
 3     4
 3     5

次のようなデータセットを作成したい:

id   region1 region2 region3 region4 region5
 1     0         1      1       0      0
 2     1         0      1       0      0
 3     0         0      0       1      1

私は毎回因子regionNを作成する手書きのループを使用してきましたが、このプロセスを自動化する方法があることを望んでいます。

私も失敗した次のことを試しました。

n <- 1
while(n <= nrow(region_list))  {
  paste("R",as.character(region_list$region_id[n])) <- subset(region_list, region_list$region_id == n)
  n <- n + 1
}
4

2 に答える 2

1
DF <- data.frame(id = c(1,1,2,3,3), region = c(2,3,1,4,5))
DM <- table(DF)
DM
#   region
#id  1 2 3 4 5
#  1 0 1 1 0 0
#  2 1 0 0 0 0
#  3 0 0 0 1 1
is.matrix(DM)
#[1] TRUE

require(reshape)
DF2 <- cast(data.frame(DM),id~region)
names(DF2)[-1] <- paste("region",names(DF2)[-1],sep="")
DF2
#  id region1 region2 region3 region4 region5
#1  1       0       1       1       0       0
#2  2       1       0       0       0       0
#3  3       0       0       0       1       1
于 2012-07-21T08:47:56.407 に答える
0

このソリューションはddplyフォームプライアを使用しますが、同様の分割-適用-結合ツールは同じ基本部分で機能します。

dat <- read.table(text = "id   region
 1     2
 1     3
 2     1
 3     4
 3     5",header = TRUE,sep = "",stringsAsFactors = TRUE)

dat$region <- factor(dat$region)

foo <- function(x){
    res <- as.integer(levels(x$region) %in% x$region)
    names(res) <- paste0("region",1:5)
    res
}

ddply(dat,.(id),.fun = foo)
   id region1 region2 region3 region4 region5
1  1       0       1       1       0       0
2  2       1       0       0       0       0
3  3       0       0       0       1       1

ファクターへの変換を回避することはできますがregion、その場合、内部で取得できる可能性のある一意の値をハードコーディングする必要があると思いますfoo

于 2012-07-21T02:10:03.017 に答える