【问题标题】:Subsetting from a list of data.frames based on a variable in R基于 R 中的变量从 data.frames 列表中设置子集
【发布时间】:2019-12-16 12:09:21
【问题描述】:

我有一个 data.frame HERE。使用subset() 我试图取出study.names(data.frame 中的一列)只有1s 变量post 而不是23

因此,我的期望输出是找出有多少研究只有post == 1,没有post == 2,或3

这是我尝试但没有成功的方法:

D <- read.csv("https://raw.githubusercontent.com/izeh/m/master/k.csv", h = T) # The data

m <- split(D, D$study.name) ; m[[1]] <- NULL  # split by `study.names`

subset(m, post == 1 & post != 2 & post != 3)  # subset studies with only post == 1 
                                              # but not post == 2 and post == 3


Error: object 'post' not found     

【问题讨论】:

    标签: r list dataframe subset lapply


    【解决方案1】:

    您使用 subset 函数的方式在全局环境中查找名为 post 的对象,但它不存在,因为它只是数据中的一列。

    执行此操作的简单方法是利用 sapply 使用 all 函数构造一个逻辑条件,然后以这种方式子集列表:

    cond <- sapply(m, function(df) all(df$post == 1))
    
    m[cond]
    

    【讨论】:

    • df 是函数参数的名称,它一定要运行
    【解决方案2】:

    您的第一个问题是 subset 不能像您期望的那样在列表上工作。

    D <- read.csv("https://raw.githubusercontent.com/izeh/m/master/k.csv", h = T) # The data
    
    m <- split(D, D$study.name) ; 
    
    m[[1]] <- NULL  # split by `study.names`
    
    table(sapply(m, function(x) all(x[["post"]]==1)) )
    # FALSE  TRUE 
    # 5     2 
    

    还有一个 tidyverse 解决方案:

    D %>% group_by(study.name) %>% summarise(only_1=all(post==1))
    # study.name only_1
    # <fct>      <lgl> 
    #   1 ""         NA    
    # 2 Bit.KnoA   FALSE 
    # 3 Bit.KnoB   FALSE 
    # 4 ChandlerA  TRUE  
    # 5 Mubarak    FALSE 
    # 6 Sheen      FALSE 
    # 7 Shin.Ellis FALSE 
    # 8 Trus.Hsu   TRUE 
    
    D %>% group_by(study.name) %>% summarise(only_1=all(post==1)) %>% summarise(tot=sum(only_1, na.rm = T))
    # A tibble: 1 x 1
    # tot
    # <int>
    #   1     2
    

    【讨论】:

    • 有没有办法使用subset
    • subset 用于过滤数据帧、向量或矩阵,但不用于列表。你可以这样做,但它会很复杂,并且仍然需要一个带有一些额外逻辑的 *apply 函数。
    【解决方案3】:

    如果您只查找1 记录,您可以检查post1 元素的数量是否等于data.frame 的行数。

    only_1 &lt;- sapply(m, function(x) sum(x$post == 1) == nrow(x))

    这会返回

      Bit.KnoA   Bit.KnoB  ChandlerA    Mubarak      Sheen Shin.Ellis   Trus.Hsu 
         FALSE      FALSE       TRUE      FALSE      FALSE      FALSE       TRUE 
    

    那么只有 1 个值的研究数量为:

    sum(only_1)
    [1] 2
    

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2013-06-09
      • 2021-11-14
      相关资源
      最近更新 更多