【问题标题】:Calculate percentage when all values are in the same column of a dataframe in R当所有值都在R中数据框的同一列中时计算百分比
【发布时间】:2020-10-13 18:53:28
【问题描述】:

我有以下数据框

x <- data.frame("treatment"= c(1, 1, 1, 1, 2, 2, 2, 2), 
              "Time" = c(0, 30, 60, 180, 0, 30, 60, 180), 
              "cells_alive" = c(500, 470, 100, 20, 476, 310, 99, 2))

在这个实验中,我有两种处理方法,我测量了一段时间内的活细胞数量。时间 0 的细胞数是该处理的初始细胞数。我需要计算新列中每次存活细胞的百分比。所以在治疗 1 的情况下,它将是 500/500、470/500、100/500 等等。关于如何计算的任何想法?

谢谢

【问题讨论】:

    标签: r percentage


    【解决方案1】:
    require(tidyverse)
    
    x %>% 
    left_join(x %>% select(treatment, cells_alive) %>% 
    group_by(treatment) %>% 
    top_n(1) %>% 
    ungroup(), by = "treatment") %>% 
    mutate(cells_alive_per = cells_alive.x/cells_alive.y)
    

    【讨论】:

    • 谢谢,效果很好!现在,如果我在治疗中也有重复,它会如何工作?
    【解决方案2】:

    使用data.table

    library(data.table)
    setDT(x) #converting x to data.table 
    x[,.(Time, value = cells_alive / cells_alive[which(Time == 0)]),treatment]
    
    #output
       treatment Time       value
    1:         1    0 1.000000000
    2:         1   30 0.940000000
    3:         1   60 0.200000000
    4:         1  180 0.040000000
    5:         2    0 1.000000000
    6:         2   30 0.651260504
    7:         2   60 0.207983193
    8:         2  180 0.004201681
    

    【讨论】:

      【解决方案3】:

      在发布了dplyrdata.table版本之后,为了完整起见,这里不需要安装包:

      stack(tapply(x$cells_alive, x$treatment, function(ca) ca / ca[1] ))
      

      给了

      > stack(tapply(x$cells_alive, x$treatment, function(ca) ca / ca[1] ))
             values ind
      1 1.000000000   1
      2 0.940000000   1
      3 0.200000000   1
      4 0.040000000   1
      5 1.000000000   2
      6 0.651260504   2
      7 0.207983193   2
      8 0.004201681   2
      

      【讨论】:

        猜你喜欢
        • 2012-09-16
        • 1970-01-01
        • 2018-01-22
        • 2013-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多