Как создать именованный список из фрейма данных на основе фильтра

Мой вопрос заключается в том, как упростить код ниже.

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

Другие вопросы по тегам