使用管道在列表中的单个列上应用 dplyr 函数
Apply dplyr functions on a single column across a list using piping
我正在尝试在特定列的数据框列表中过滤某些内容。通常在使用 dplyr 的单个数据帧中,我会使用:
#creating dataframe
df <- data.frame(a = 0:10, d = 10:20)
# filtering column a for rows greater than 7
df %>% filter(a > 7)
我尝试使用以下方法在列表中执行此操作:
# creating list
x <- list(data.frame(a = 0:10, b = 10:20),
data.frame(c = 11:20, d = 21:30),
data.frame(e = 15:25, f = 35:45))
# selecting the appropriate column and trying to filter
# this is not working
x[1][[1]][1] %>% lapply(. %>% {filter(. > 2)})
# however, if I use the min() function it works
x[1][[1]][1] %>% lapply(. %>% {min(.)})
我发现 %>%
语法很容易理解和执行。但是,在这种情况下,选择一个特定的列并执行一些非常简单的操作(如过滤)是行不通的。我猜 map 可能同样有用。感谢任何帮助。
您可以使用 filter_at
按位置引用列。
library(dplyr)
purrr::map(x, ~.x %>% filter_at(1, any_vars(. > 7)))
在filter
中,您可以对列进行子集化并使用它
purrr::map(x, ~.x %>% filter(.[[1]] > 7))
在基础 R 中,这将是:
lapply(x, function(y) y[y[[1]] > 7, ])
您似乎有兴趣检查列表中每个数据框第一列的条件。
使用 dplyr
的一种解决方案是
lapply(x, function(df) {df %>% filter_at(1, ~. > 7)})
filter_at
中的1
表示我要检查第第列上的条件(1
是位置索引)列表中的每个数据框。
编辑
经过评论中的讨论,我提出以下解决方案
lapply(x, function(df) {df %>% filter(a > 7) %>% select(a) %>% slice(1)})
输入数据
x <- list(data.frame(a = 0:10, b = 10:20),
data.frame(a = 11:20, b = 21:30),
data.frame(a = 15:25, b = 35:45))
输出
[[1]]
a
1 8
[[2]]
a
1 11
[[3]]
a
1 15
将 filter
与 across
结合使用
library(dplyr)
library(purrr)
map(x, ~ .x %>%
filter(across(names(.)[1], ~ .> 7)))
我正在尝试在特定列的数据框列表中过滤某些内容。通常在使用 dplyr 的单个数据帧中,我会使用:
#creating dataframe
df <- data.frame(a = 0:10, d = 10:20)
# filtering column a for rows greater than 7
df %>% filter(a > 7)
我尝试使用以下方法在列表中执行此操作:
# creating list
x <- list(data.frame(a = 0:10, b = 10:20),
data.frame(c = 11:20, d = 21:30),
data.frame(e = 15:25, f = 35:45))
# selecting the appropriate column and trying to filter
# this is not working
x[1][[1]][1] %>% lapply(. %>% {filter(. > 2)})
# however, if I use the min() function it works
x[1][[1]][1] %>% lapply(. %>% {min(.)})
我发现 %>%
语法很容易理解和执行。但是,在这种情况下,选择一个特定的列并执行一些非常简单的操作(如过滤)是行不通的。我猜 map 可能同样有用。感谢任何帮助。
您可以使用 filter_at
按位置引用列。
library(dplyr)
purrr::map(x, ~.x %>% filter_at(1, any_vars(. > 7)))
在filter
中,您可以对列进行子集化并使用它
purrr::map(x, ~.x %>% filter(.[[1]] > 7))
在基础 R 中,这将是:
lapply(x, function(y) y[y[[1]] > 7, ])
您似乎有兴趣检查列表中每个数据框第一列的条件。
使用 dplyr
的一种解决方案是
lapply(x, function(df) {df %>% filter_at(1, ~. > 7)})
filter_at
中的1
表示我要检查第第列上的条件(1
是位置索引)列表中的每个数据框。
编辑
经过评论中的讨论,我提出以下解决方案
lapply(x, function(df) {df %>% filter(a > 7) %>% select(a) %>% slice(1)})
输入数据
x <- list(data.frame(a = 0:10, b = 10:20),
data.frame(a = 11:20, b = 21:30),
data.frame(a = 15:25, b = 35:45))
输出
[[1]]
a
1 8
[[2]]
a
1 11
[[3]]
a
1 15
将 filter
与 across
library(dplyr)
library(purrr)
map(x, ~ .x %>%
filter(across(names(.)[1], ~ .> 7)))