【问题标题】:Subsetting certain dataframes that satisfy a condition from a list从列表中对满足条件的某些数据帧进行子集化
【发布时间】:2018-02-01 22:39:48
【问题描述】:

我刚刚开始使用列表和 lapply 功能,但遇到了一些困难。我有一个包含多个数据框的列表,并希望对满足特定条件的数据框进行子集化并将其保存为单独的列表。例如,

l <- list(data.frame(PPID=1:5, gender=c(rep("male", times=5))),
          data.frame(PPID=1:5, gender=c("male", "female", "male", "male", "female")), 
          data.frame(PPID=1:3, gender=c("male", "female", "male")))

print(l)

我想要做的是仅对同时具有性别(男性和女性)的列表进行子集化,并将其保存为另一个列表。所以我的结果应该是另一个列表,它只包含 l 中的第二个和第三个数据帧。

我尝试过的事情包括:

ll <- subset(l, lapply(1:length(l), function(i) { 
      length(levels(l[[i]]$gender)) == 2
      }))

ll <- subset(l, lapply(1:length(l), function(i) { 
      l[[i]]$gender == "male" | l[[i]]$gender == "female"
      }))

但这给我返回了一个 0 的列表。 任何帮助将不胜感激!!

【问题讨论】:

    标签: r list subset


    【解决方案1】:

    如果你愿意切换到 purrr,你可以简单地:

    > library(purrr)
    > keep(l, ~ length(unique(.x$gender)) > 1)
    [[1]]
      PPID gender
    1    1   male
    2    2 female
    3    3   male
    4    4   male
    5    5 female
    
    [[2]]
      PPID gender
    1    1   male
    2    2 female
    3    3   male
    

    【讨论】:

      【解决方案2】:

      这适用于基础 R:

         lapply(l, function(x) if (length(unique(x$gender)) == 2) x)
         #[[1]]
         #NULL
         #
         #[[2]]
         #  PPID gender
         #1    1   male
         #2    2 female
         #3    3   male
         #4    4   male
         #5    5 female
         #
         #[[3]]
         #  PPID gender
         #1    1   male
         #2    2 female
         #3    3   male
      

      如果您不想保留 NULL 条目,您可以这样做

      l2 <- lapply(l, function(x) if (length(unique(x$gender)) == 2) x)
      Filter(Negate(is.null), l2);
      

      您的代码的一个问题是,虽然genderfactor,但它在所有列表元素中都没有相同的levels。您可以检查:

      str(l);
      #List of 3
      # $ :'data.frame':  5 obs. of  2 variables:
      #  ..$ PPID  : int [1:5] 1 2 3 4 5
      #  ..$ gender: Factor w/ 1 level "male": 1 1 1 1 1
      # $ :'data.frame':  5 obs. of  2 variables:
      #  ..$ PPID  : int [1:5] 1 2 3 4 5
      #  ..$ gender: Factor w/ 2 levels "female","male": 2 1 2 2 1
      # $ :'data.frame':  3 obs. of  2 variables:
      #  ..$ PPID  : int [1:3] 1 2 3
      #  ..$ gender: Factor w/ 2 levels "female","male": 2 1 2
      

      【讨论】:

      • @KevinArseneau 啊,是的,你是对的。应该更仔细地阅读。我已经更新了我的答案。
      • 不用担心@yjpark;您可以/应该通过在最能回答您的问题的解决方案旁边打勾来结束问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2018-02-26
      相关资源
      最近更新 更多