筛选数据框并将结果附加到现有列表中 R。

3

我希望筛选一个数据框的列(col_A),并将输出附加到现有列表中。要应用于 col_A 的过滤器包含在向量 col_A_filters 中。

我的问题是如何使用 R 创建此功能。

示例:

Df <- data.frame(
  col_A = c("abc","def"),
  col_B = c(123,456)
)

# existing lists:
abc <- list()
def <- list()


col_A_filters <- c("abc", "def")

输出应该是将Df的过滤行添加到abc和def列表中。
2个回答

4

这里有一种使用 mgetappend 的方法。

Df <- data.frame(
  col_A = c("abc","def"),
  col_B = c(123,456)
)

# existing lists:
abc <- list()
def <- list()

col_A_filters <- c("abc", "def")

l <- mget(col_A_filters, envir = .GlobalEnv)
for(i in col_A_filters) {
  new <- Df[Df$col_A == i, ]
  l[[i]] <- append(l[[i]], new)
  l[[i]] <- as.data.frame(l[[i]])
}
list2env(l, envir = .GlobalEnv)
#> <environment: R_GlobalEnv>

abc
#>   col_A col_B
#> 1   abc   123

def
#>   col_A col_B
#> 1   def   456

本文创建于2022年11月16日,使用reprex v2.0.2


2

使用{purrr}的另一种选项:

library(tidyverse)
col_A_filters <- c("abc", "def")
x <- col_A_filters |> 
  as.list()|> 
  map(~Df |> 
        filter(str_detect(col_A, .x))) |> 
  set_names(col_A_filters)

y <- mget(col_A_filters, envir = .GlobalEnv)
map2(l, x, append) |> map(as.data.frame)

输出:

$abc
  col_A col_B
1   abc   123

$def
  col_A col_B
1   def   456

这个解决方案完成了第一部分(过滤数据框列(col_A),但如何将输出附加到现有列表中? - learneR
你是完全正确的,对此我感到抱歉。我只能想到与@Rui类似的解决方案,使用mget。我进行了小修改。 - Julian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接