【问题标题】:Splitting a data frame by the values from one of the columns in R根据 R 中某一列的值拆分数据框
【发布时间】:2021-08-23 22:57:56
【问题描述】:

我是 R 的新手,我们得到了一个关于苍蝇的数据集,其中包含物种和性别等列标题。共有111种。目标是了解每个物种中有多少雄性和雌性,并将其制成可用于进一步分析的形式(t 检验)。

理想情况下,我会有一个包含 3 列(物种、女性人数、男性人数)的数据框。我使用了迄今为止给我最好结果的拆分功能,问题是我不知道如何在合理的时间内为 111 个物种执行此操作。我虽然关于使用 for 循环,但不确定如何做到这一点。这是我使用的拆分代码:

data_split <- split(data, data$Species)
data_split
sp1 <- data_split$D_acutila
data.frame(table(sp1$Sex))

【问题讨论】:

标签: r dataframe split


【解决方案1】:

使用基础 R 你可以这样做:

set.seed(42)

data <- data.frame(
  Species = rep(c("A", "B", "C"), 20),
  Sex = sample(c("m", "f"), 60, replace = TRUE)
)

data_split <- split(data, data$Species)
data_table <- lapply(data_split, function(x) table(x$Sex))
data_table <- do.call("rbind", data_table)
cbind(Species = rownames(data_table), as.data.frame(data_table))
#>   Species  f  m
#> A       A 11  9
#> B       B 12  8
#> C       C 10 10

或使用tapply 代替split + lapply

data_table <- tapply(data$Sex, data$Species, table)
data_table <- do.call("rbind", data_table)
cbind(Species = rownames(data_table), as.data.frame(data_table))
#>   Species  f  m
#> A       A 11  9
#> B       B 12  8
#> C       C 10 10

reprex package (v2.0.0) 于 2021-06-06 创建

【讨论】:

    【解决方案2】:

    我创建了一个简单的数据框,我认为它与您正在使用的数据框相似

    df <- data.frame(species = sample(c('A', 'B', 'C'), 100, replace = T),
                     sex = sample(c('M', 'F'), 100, replace = T))
    df
    

    您可以使用 dplyr 包解决此问题:

    library(dplyr)
    
    #create an auxiliar column to be summed
    df$aux <- 1
    
    #group by species and sex, summarise the groups by the sum of the auxiliar column
    summary <- df %>%
      group_by(species, sex) %>%
      summarise(count_subjects = sum(aux))
    
    summary
    

    【讨论】:

    • 谢谢你,这给了我我一直在寻找的结果。一位朋友使用同样有效的 tidyverse 库提供了一个不同的解决方案。 install.packages("tidyverse") library(tidyverse) MFspecies &lt;- data%&gt;%count(Species,Sex) print(MFspecies)
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 2021-06-03
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多