1

私は次のデータ構造を持っています(これは実際には「結果」の発生をddplyでカウントすることによって作成されました):

Experiment Result Count
         A      1   123
         A      2   30
         A      3   5
         B      1   120
         B      2   20
         B      3   5
         B      4   1
         B      5   1
         C      1   130
         C      2   21
...

2より大きいすべての結果をグループ化(合計を計算)する同様のデータフレームを作成したいと思います。

期待される結果:

Experiment Result Count
         A      1   123
         A      2    30
         A     >2     5
         B      1   120
         B      2    20
         B     >2     7
         C      1   130
         C      2    21
...

おそらくplyrはこれを行うことができますが、私はRを初めて使用し、列の個別の値だけでなく、カスタム条件(つまり、結果1、2、> 2)を使用する方法がわかりません。

注:新しいビンの名前は気にしません(つまり、!='<2'の場合があります)。

4

3 に答える 3

2
data <- data.frame(Experiment = c("a","a","a","b","b","b"), 
                   Result = c(1,2,3,1,4,5), Count = c(1,4,6,5,3,6))
part1 <- subset(data, Result<=2)
part2 <- cbind(ddply(data, .(Experiment), summarise, 
               Count = sum(Count[Result>2])), Result = ">2")
final <- rbind(part1,part2)
final[with(final, order(Experiment, rev(Result))),]
   Experiment Result Count
1           a      1     1
2           a      2     4
41          a     >2     6
4           b      1     5
5           b     >2     9
data
  Experiment Result Count
1          a      1     1
2          a      2     4
3          a      3     6
4          b      1     5
5          b      4     3
6          b      5     6
于 2012-05-31T19:37:01.973 に答える
1

回答ありがとうございます。その間、私はこの解決策を思いつきました:

data2 <- ddply(data[data$Result>2,],c('Experiment'), function(x) c(Result='>2', Count=sum(x$sum)))
data3 <-rbind(data[data$Result<=2,], data2)

(結果はまだ並べ替える必要があります。)

于 2012-05-31T19:49:14.023 に答える
1

これがベースです:

#データを読み込む:

dat <- read.table(text="Experiment Result Count
         A      1   123
         A      2   30
         A      3   5
         B      1   120
         B      2   20
         B      3   5
         B      4   1
         B      5   1
         C      1   130
         C      2   21", header=T)

#コード:

dat$bp <- factor(cut(dat$Result, c(0,2, Inf)), 
    labels=c(NA, "> 2"))                            #bin dat > 2
LS1 <- split(dat, dat$bp)                           #split by bins
LS2 <- aggregate(Count~Experiment, LS1[[2]], sum)   #sum by experiment 
LS2$Result <- LS2$bp <- unique(LS1[[2]]$bp)         #get columns ready for bind
LS2 <- LS2[, names(LS1[[1]])]                               
DF <- do.call(rbind, list(LS1[[1]], LS2))[, -4]     #bind it together & drop bp
DF$Result <- factor(DF$Result, 
    levels = unique(DF$Result))                     #reorder factor
DF[order(DF$Experiment, DF$Result), ]               #order dataframe

どの利回り:

   Experiment Result Count
1           A      1   123
2           A      2    30
7           A    > 2     5
4           B      1   120
5           B      2    20
8           B    > 2     7
9           C      1   130
10          C      2    21
于 2012-05-31T19:43:25.263 に答える