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),而不仅仅是列的不同值。

注意:我不介意新 bin 的名称(即,可能是 != '<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

这是基础:

#读入你的数据:

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 回答
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 回答