子集列表中符合特定条件的多个数据帧
Subset multiples data frames in a list that match a certain condition
我是新手,我被困住了。我有一个数据框列表,其中包含有关压力、温度和盐度的信息。我想对所有这些进行子集化,并仅保留压力等于 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"))
但到目前为止似乎没有任何效果......
我在这里搜索了答案,但很难找到具体的答案。
我创建了一个示例数据。当你使用 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, ])
我是新手,我被困住了。我有一个数据框列表,其中包含有关压力、温度和盐度的信息。我想对所有这些进行子集化,并仅保留压力等于 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"))
但到目前为止似乎没有任何效果...... 我在这里搜索了答案,但很难找到具体的答案。
我创建了一个示例数据。当你使用 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, ])