如何从基于过滤器的数据框中创建命名列表
How to create a named list from dataframe based in a filter
我的问题是如何简化下面的代码。
我有一个包含两列(或更多列)的数据框,其中我对列 'a' 中的所有值感兴趣,其中列 'b' 的值为 x。
由于 x 可以是一个或多个值,我想基于所有可能的过滤器构建一个命名列表。
所以,我是 R 的新手,我解决了这个问题,但我认为这不是最好的解决方案。
a <- c('a', 'b','c','d','e','f','g','h','i')
b <- c('aa', 'bb','cc')
ds <- data.frame(a, b)
func <- function(ds, target_col, query_col, value){
return (unlist(list(unique(as.vector(ds[ds[query_col] == value,][target_col][,1])))))
}
named_list <- list()
for (i in b){
named_list[[i]] <- func(ds, 'a', 'b', i)
}
func
可以简化;以下是等效的,假设 target_col
的长度始终为一:
func <- function(ds, target_col, query_col, value){
return (unique(as.vector(ds[ds[query_col] == value, target_col])))
}
您可以使用 lapply
函数创建命名列表
named_list2 <- lapply(setNames(nm = b), func, ds = ds, target_col = "a", query_col = "b")
其中 setNames
创建一个名称与值相同的命名向量; lapply
使用此向量中的名称输出命名列表。
我的问题是如何简化下面的代码。
我有一个包含两列(或更多列)的数据框,其中我对列 'a' 中的所有值感兴趣,其中列 'b' 的值为 x。 由于 x 可以是一个或多个值,我想基于所有可能的过滤器构建一个命名列表。
所以,我是 R 的新手,我解决了这个问题,但我认为这不是最好的解决方案。
a <- c('a', 'b','c','d','e','f','g','h','i')
b <- c('aa', 'bb','cc')
ds <- data.frame(a, b)
func <- function(ds, target_col, query_col, value){
return (unlist(list(unique(as.vector(ds[ds[query_col] == value,][target_col][,1])))))
}
named_list <- list()
for (i in b){
named_list[[i]] <- func(ds, 'a', 'b', i)
}
func
可以简化;以下是等效的,假设 target_col
的长度始终为一:
func <- function(ds, target_col, query_col, value){
return (unique(as.vector(ds[ds[query_col] == value, target_col])))
}
您可以使用 lapply
函数创建命名列表
named_list2 <- lapply(setNames(nm = b), func, ds = ds, target_col = "a", query_col = "b")
其中 setNames
创建一个名称与值相同的命名向量; lapply
使用此向量中的名称输出命名列表。