【问题标题】:Using lapply to subset a dataframe based on two or more factor variables使用 lapply 基于两个或多个因子变量对数据框进行子集化
【发布时间】:2020-10-03 22:15:06
【问题描述】:

这是 StackOverflow 问题的扩展 - Subset Data Based On Elements In List - 它回答了如何创建新 dfs 列表的问题,每个新 dfs 都是通过基于分组因子变量对原始一个子集来构造的。

我遇到的挑战是我需要使用多个分组变量来创建 dfs

为了概括这个问题,我创建了这个玩具数据集——它以每天的降雨量作为响应变量,以当天的温度范围和云量作为分类器。

rain <- c(2, 0, 4, 25, 3, 9, 4, 0, 4, 0, 8, 35)
temp <- as.factor(c("Warm","Cold","Hot","Cold","Warm","Cold","Cold","Warm","Warm","Hot","Cold", "Cold"))
clouds <- as.factor(c("Some","Lots","None","Lots","None","None","Lots","Some","Some","Lots","None", "Some"))
df <- data.frame(rain, temp, clouds)

使用以下代码,我可以生成三个新的数据帧,这些数据帧按 temp 变量分组,全部组合成一个列表 (df_1A):

temp_levels <- unique(as.character(df$temp))
df_1A <- lapply(temp_levels, function(x){subset(df, temp == x)})

同样适用于按云量分组的三个新数据帧

cloud_levels <- unique(as.character(df$clouds))
df_1B <- lapply(cloud_levels, function(x){subset(df, clouds == x)})

但是,我无法想出一种简单、优雅的方式来生成 9 个数据帧,每个数据帧都有独特的温度和云量组合

谢谢

【问题讨论】:

    标签: r dataframe subset apply


    【解决方案1】:

    您可以使用split 根据tempclouds 的唯一级别划分数据。

    df_1 <- split(df, list(df$temp, df$clouds))
    

    【讨论】:

    • 这正是我所希望的解决方案。谢谢!
    【解决方案2】:

    您的问题暗示了对lapply 的偏好,但如果您不介意使用dplyr,则有一个优雅的解决方案。

    
    library(dplyr)
    
    df_list <- 
       df %>% 
       group_by(temp, clouds) %>% 
       group_split()
    
    # df_list
    
    df_list[[1]]
    #> # A tibble: 3 x 3
    #>    rain temp  clouds
    #>   <dbl> <fct> <fct> 
    #> 1     0 Cold  Lots  
    #> 2    25 Cold  Lots  
    #> 3     4 Cold  Lots
    

    您的数据

    rain <- c(2, 0, 4, 25, 3, 9, 4, 0, 4, 0, 8, 35)
    temp <- as.factor(c("Warm","Cold","Hot","Cold","Warm","Cold","Cold","Warm","Warm","Hot","Cold", "Cold"))
    clouds <- as.factor(c("Some","Lots","None","Lots","None","None","Lots","Some","Some","Lots","None", "Some"))
    df <- data.frame(rain, temp, clouds)
    
    

    【讨论】:

    • 非常感谢。我还没有完全接受 tidyverse 数据分析方式的阶段 - 因此我已经给使用 core R 的回复打勾。但是,我相信对于那些喜欢 dplyr 解决方案的人来说,你的将是一个非常有用的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多