簡體   English   中英

使用管道在列表中的單個列上應用 dplyr 函數

[英]Apply dplyr functions on a single column across a list using piping

我正在嘗試在特定列的數據框列表中過濾某些內容。 通常跨單個 dataframe 使用 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來引用 position 的列。

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, ])

您似乎有興趣檢查列表中每個 dataframe 第一列的條件。 使用dplyr的一種解決方案是

lapply(x, function(df) {df %>% filter_at(1, ~. > 7)})

filter_at中的1表示我要檢查列表中每個 dataframe 的第一列( 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))

Output

[[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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM