在列表中设置与特定条件匹配的多个数据帧

时间:2015-02-23 00:10:54

标签: r list subset

我是新手,我被困住了。我有一个数据框列表,其中包含有关压力,温度和盐度的信息。我希望将它们全部分组,并在压力等于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"))

但到目前为止似乎没有任何工作...... 我在这里寻找答案,但很难找到具体的新人。

1 个答案:

答案 0 :(得分:3)

我创建了一个示例数据。使用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, ])