如果其他列> x中的值并创建新数据框,则计算列的值

时间:2012-05-31 19:09:28

标签: r dataframe

我有以下数据结构(实际上是通过使用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')。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是基础:

#Read in your data:

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)

#The code:

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

答案 2 :(得分: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)

(结果仍然需要重新排序。)