【问题标题】:Count values of a column if value in other column >x and create new data frame如果其他列中的值> x,则计算列的值并创建新数据框
【发布时间】:2012-06-01 03:49:14
【问题描述】:

我有以下数据结构(实际上是通过使用 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 的名称(即,可能是 != '

【问题讨论】:

    标签: r dataframe


    【解决方案1】:
    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
    

    【讨论】:

    • 我接受了您的解决方案,因为我认为它更容易理解。顺便说一句:您的解决方案和我的解决方案之间的区别在于,您的解决方案还为没有结果 > 2 的实验创建行。
    【解决方案2】:

    这是基地:

    #读入你的数据:

    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
    

    【讨论】:

      【解决方案3】:

      感谢您的回答。与此同时,我想出了这个解决方案:

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

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

      【讨论】:

        猜你喜欢
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 2017-08-09
        相关资源
        最近更新 更多