Как создать именованный список из фрейма данных на основе фильтра
Мой вопрос заключается в том, как упростить код ниже.
У меня есть фрейм данных с двумя (или более) столбцами, где меня интересуют все значения из столбца "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)
}
1 ответ
Решение
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
выводит именованный список, используя имена из этого вектора.