2

次のデータフレームがあるとします

treatmet1<-data.frame(id=c(1,2,7))
treatment2<-data.frame(id=c(3,7,10))
control<-data.frame(id=c(4,5,8,9))

これらの 3 つの結合である新しいデータ フレームを作成し、それぞれに値 1 を取るインジケーター列を作成したいと考えています。

experiment<-data.frame(id=c(1:10),treatment1=0, treatment2=0, control=0)

どこexperiment$treatment1[1]=1などなど

Rでこれを行う最良の方法は何ですか?

ありがとう!

4

4 に答える 4

3
df.bind <- function(...) {

  df.names <- all.names(substitute(list(...)))[-1L]
  ids.list <- setNames(lapply(list(...), `[[`, "id"), df.names)
  num.ids  <- max(unlist(ids.list))
  tabs     <- lapply(ids.list, tabulate, num.ids)

  data.frame(id = seq(num.ids), tabs)
}

df.bind(treatment1, treatment2, control)

#    id treatment1 treatment2 control
# 1   1          1          0       0
# 2   2          1          0       0
# 3   3          0          1       0
# 4   4          0          0       1
# 5   5          0          0       1
# 6   6          0          0       0
# 7   7          1          1       0
# 8   8          0          0       1
# 9   9          0          0       1
# 10 10          0          1       0

( の行が含まれていることに注意してくださいid == 6。)

于 2013-09-15T21:18:13.717 に答える
2

取る

treatment1<-data.frame(id=c(1,2,7))
treatment2<-data.frame(id=c(3,7,10))
control<-data.frame(id=c(4,5,8,9))

これを使用できます:

x <- c("treatment1", "treatment2", "control")
f <- function(s) within(get(s), assign(s, 1))
r <- Reduce(function(x,y) merge(x,y,all=TRUE), lapply(x, f))
r[is.na(r)] <- 0

結果:

> r
  id treatment1 treatment2 control
1  1          1          0       0
2  2          1          0       0
3  3          0          1       0
4  4          0          0       1
5  5          0          0       1
6  7          1          1       0
7  8          0          0       1
8  9          0          0       1
9 10          0          1       0
于 2013-09-15T21:17:33.530 に答える
0

これは、私が想像していたrbind戦略を示しています。

alldf <- rbind(treatmet1,treatment2,control)
alldf$grps <- model.matrix( ~ factor( c( rep(1,nrow(treatmet1)),
                                            rep(2,nrow(treatment2)),
                                            rep(3,nrow(control) ) ))-1)
dimnames( alldf[[2]])[2]<- list(c("trt1","trt2","ctrl"))
 alldf
#-------------------
   id grps.trt1 grps.trt2 grps.ctrl
1   1         1         0         0
2   2         1         0         0
3   7         1         0         0
4   3         0         1         0
5   7         0         1         0
6  10         0         1         0
7   4         0         0         1
8   5         0         0         1
9   8         0         0         1
10  9         0         0         1
于 2013-09-16T15:53:00.443 に答える