Использование lapply над списком и добавление столбца с именем фрейма данных - PullRequest
3 голосов
/ 09 октября 2019

У меня есть список, содержащий два фрейма данных:

sample_list <- list("tables" = data.frame(weight = sample(1:50, 20, replace = T)),
                    "chairs" = data.frame(height = sample(1:50, 20, replace = T)))

Я хотел бы использовать lapply для запуска функции над всеми фреймами данных в этом списке. В выходных данных каждой функции мне нужно создать еще один столбец с именем исходного фрейма данных (см. mutate):

lapply(sample_list, function(x) {
  x %>% 
    filter(x >= 20) %>% 
    mutate(groupName = names(x))
})

По какой-то причине я не могу понять, как сделатьэта работа. Как передать имя фрейма данных в mutate? Прямо сейчас он возвращает имя первого столбца в этом фрейме данных, а не имя самого фрейма данных.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 09 октября 2019

Мы можем перебрать names из sample_list вместо циклического перебора списка

lapply(names(sample_list), function(x) {
    sample_list[[x]] %>% 
        filter_at(vars(1),~. >= 20) %>% 
        mutate(groupName = x)
})
2 голосов
/ 09 октября 2019

Вы можете попробовать purrr::imap() отобразить как элементы, так и имена элементов.

# purrr::imap
purrr::imap(sample_list, function(element,name){
    head(mutate(element,groupName = name))
})

# or mapply, but you need to specify names of the list
myfun <- function(element,name){
    head(mutate(element,groupName = name))
}

mapply(myfun,sample_list,names(sample_list),SIMPLIFY = FALSE)

$tables
  weight groupName
1     42    tables
2     24    tables
3     13    tables
4     31    tables
5      9    tables
6     27    tables

$chairs
  height groupName
1     18    chairs
2      6    chairs
3     34    chairs
4     37    chairs
5     36    chairs
6     49    chairs
0 голосов
/ 09 октября 2019

Использование Map из base R

Map(function(dat, grp) cbind(dat, group_name = grp)[dat[[1]] > 20,], 
             sample_list, names(sample_list))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...