【问题标题】:Subset multiples data frames in a list that match a certain condition对列表中匹配特定条件的多个数据框进行子集化
【发布时间】:2015-04-24 06:16:49
【问题描述】:

我是新手,我被困住了。我有一个数据框列表,其中包含有关压力、温度和盐度的信息。我想对所有这些进行子集化,并在压力等于 5 时仅保留温度和盐度的值。下面是列表的结构:

str(CT_STP)
List of 3
$ CT01_CTD1:'data.frame':      41 obs. of  3 variables:
  ..$ pressure   : num [1:41] 1 2 3 4 5 6 7 8 9 10 ...
  ..$ temperature: num [1:41] 18.8 18.8 18.8 18.8 18.8 ...
  ..$ salinity   : num [1:41] 34.1 34.1 34.1 34.1 34.1 ...
 $ CT02_CTD1:'data.frame':      69 obs. of  3 variables:
  ..$ pressure   : num [1:69] 2 3 4 5 6 7 8 9 10 11 ...
  ..$ temperature: num [1:69] 18.7 18.7 18.7 18.7 18.7 ...
  ..$ salinity   : num [1:69] 34 34 34 34 34 ...
 $ CT03_CTD1:'data.frame':      79 obs. of  3 variables:
  ..$ pressure   : num [1:79] 1 2 3 4 5 6 7 8 9 10 ...
  ..$ temperature: num [1:79] 18.3 18.3 18.3 18.3 18.3 ...
  ..$ salinity   : num [1:79] 33.9 33.9 33.9 33.9 33.9 ...

我想对所有数据帧进行子集化,以便在压力等于 5 时仅获得温度和盐度。

即使是这样,我也尝试了很多东西:

PROF5<-lapply(CT_STP,subset(CT_STP, pressure==5,select="pressure","temperature","salinity"))

但到目前为止似乎没有任何效果...... 我已经在这里搜索过答案,但作为新手很难找到具体的答案。

【问题讨论】:

    标签: r list subset


    【解决方案1】:

    我创建了一个示例数据。当你使用subset()时,你需要一个数据框和一个条件。当您使用lapply() 时,您将函数设为匿名。也就是说,您编写 function(x) 并进一步编写您希望 R 循环的代码。在您的情况下,您想要遍历一个列表并应用subset()。 R 将该函数应用于列表中的每个数据框并处理子集。希望这会对你有所帮助。

    df1 <- data.frame(pressure = 1:5,
                      temperature = 18:22,
                      salinity = c(34.1, 34.1, 34.1, 34.1, 34.1))
    
    df2 <- data.frame(pressure = 1:5,
                      temperature = 18:22,
                      salinity = c(34.1, 34.1, 34.1, 34.1, 34.1))
    
    mylist <- list(df1, df2)
    
    [[1]]
      pressure temperature salinity
    1        1          18     34.1
    2        2          19     34.1
    3        3          20     34.1
    4        4          21     34.1
    5        5          22     34.1
    
    [[2]]
      pressure temperature salinity
    1        1          18     34.1
    2        2          19     34.1
    3        3          20     34.1
    4        4          21     34.1
    5        5          22     34.1
    
    lapply(mylist, function(x) subset(x, pressure == 5))
    
    [[1]]
      pressure temperature salinity
    5        5          22     34.1
    
    [[2]]
      pressure temperature salinity
    5        5          22     34.1
    

    编辑

    鉴于@tospig 的评论,您还可以执行以下操作。

    lapply(mylist, function(x) x[x$pressure == 5, ])
    

    【讨论】:

    • @CarlaBerghoff 很高兴。 :)
    • 我记得在某处读过你应该避免使用subset()(但我不记得在哪里或为什么)。使用[ 的替代方法是lapply(mylist, function(x) x[x$pressure==5,])
    • @tospig 谢谢你的评论。我不知道你提到的问题。鉴于这个问题,您的建议是另一种方法。我将在我的答案中添加这一点。非常感谢您的支持。
    • 不客气。快速搜索显示 this blog post on 'pitfalls of the subset' ,它还链接到 Hadley Wickham 的一篇好文章。
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2014-02-20
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多