【问题标题】:convert data frame of counts to proportions by conditions in R通过R中的条件将计数数据帧转换为比例
【发布时间】:2016-08-25 16:51:01
【问题描述】:

我需要扩展这个问题:convert data frame of counts to proportions in R

我需要通过一个条件计算比例并保留数据集的信息。

可重现的例子:

ID <- rep(c(1,2,3), each=3)
trial <- rep("a", 9)
variable1 <- sample(1:10, 9)
variable2 <- sample(1:10, 9)
variable3 <- sample(1:10, 9)
condition <- rep(c("i","j","k"), 3)
dat <- data.frame(cbind(ID, trial,variable1,variable2,variable3,condition))

对于每个变量,我希望通过 ID 获得比例(即 3 倍) 理想情况下,新变量将存储在与dat$variable1_p 相同的数据库中

我知道如何通过一系列 for 循环来达到目的,但我想学习如何使用 apply 函数。还可以在必要时将其扩展到更多条件。

【问题讨论】:

  • 知道投反对票的原因会很有用,这样我就可以改进我的提问方式。谢谢。

标签: r apply


【解决方案1】:

我们可以使用plyr 包中的adply

library(plyr)
adply(dat, 1, function(x)
    c('variable1_p' = x$variable1 / sum(dat[x$ID == dat$ID,]$variable1)))

#   ID trial variable1 variable2 variable3 condition variable1_p
# 1  1     a         3         5         4         i  0.20000000
# 2  1     a         8         9         9         j  0.53333333
# 3  1     a         4         4         8         k  0.26666667
# 4  2     a         7        10         5         i  0.50000000
# 5  2     a         6         8        10         j  0.42857143
# 6  2     a         1         1         7         k  0.07142857
# 7  3     a        10         6         3         i  0.47619048
# 8  3     a         9         7         6         j  0.42857143
# 9  3     a         2         3         2         k  0.09523810

另一种选择是使用dplyr,它可以处理每个 ID 的每个条件多于一行的情况:

library(dplyr)
dat %>%
    group_by(ID, condition) %>%
    mutate(sum_v1_cond = sum(variable1)) %>%
    ungroup() %>%
    group_by(ID) %>%
    mutate(variable1_p = sum_v1_cond / sum(variable1)) %>%
    select(-sum_v1_cond)

编辑 - 这是variable1variable2variable3 的完整解决方案:

adply(dat, 1, function(x)
    c('variable1_p' = x$variable1 / sum(dat[x$ID == dat$ID,]$variable1),
      'variable2_p' = x$variable2 / sum(dat[x$ID == dat$ID,]$variable2),
      'variable3_p' = x$variable3 / sum(dat[x$ID == dat$ID,]$variable3)))

数据:

set.seed(123)
ID <- rep(c(1,2,3), each=3)
trial <- rep("a", 9)
variable1 <- sample(1:10, 9)
variable2 <- sample(1:10, 9)
variable3 <- sample(1:10, 9)
condition <- rep(c("i","j","k"), 3)
dat <- data.frame(ID, trial,variable1,variable2,variable3,condition,
                  stringsAsFactors = FALSE)

【讨论】:

  • 感谢您提供有用的提示,但显示的结果不是我想要的。 variable1_p 的前 3 个值必须是(在您的示例中): 0.0526; 0.5263; 0.4210。 ID=="1"的条件i,j,k的比例分别是什么。
  • @havefun 我误解了你的问题,我会尽快编辑 :)
  • @havefun 会有一个 ID 的每个条件有多于一行吗?
  • 我不确定我是否理解你的问题,我不这么认为。数据集的结构一遍又一遍地重复。
  • @havefun 例如,在第 1 行中,我们看到ID = 1condition = i,是否有可能在ID = 1condition = i 的位置有另一行?如果没有,plyradply 解决方案应该可以顺利为您工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多