Вывод lapply () в виде кадра данных с несколькими значениями с несколькими функциями - R - PullRequest
1 голос
/ 22 октября 2019

У меня есть итоговый фрейм данных (из этого вопроса ):

lst <- lapply(1:ncol(mtcars), function(i){
  x <- mtcars[[i]]
  data.frame(
    Variable_name = colnames(mtcars)[[i]],
    sum_unique = NROW(unique(x)), 
    NA_count = sum(is.na(x)), 
    NA_percent = round(sum(is.na(x))/NROW(x),2))  
  })
do.call(rbind, lst)

Где я хочу добавить пять самых высоких и самых низких значений для каждого столбца:

lst <- lapply(1:ncol(mtcars), function(i){
  x <- mtcars[[i]]
  data.frame(
    variable_name = colnames(mtcars)[[i]],
    distinct = NROW(unique(x)), 
    NA_count = sum(is.na(x)), 
    NA_percent = round(sum(is.na(x))/NROW(x),2),
    first_5 = paste0(sort(x, decreasing=TRUE)[1:5],";"),
    last_5 = paste0(sort(x)[1:5],";")
  )   
})
do.call(rbind, lst)

Но он создает новую строку для каждого значения first_5 и last_5. Почему так происходит? И как я могу это решить?

1 Ответ

0 голосов
/ 22 октября 2019

Вы почти у цели. Поскольку у вас есть пять номеров на одно место, paste0 сама не может выполнить эту работу. Одним из решений является добавление к toString следующим образом:

lst <- lapply(1:ncol(mtcars), function(i){
  x <- mtcars[[i]]
  data.frame(
    variable_name = colnames(mtcars)[[i]],
    distinct = NROW(unique(x)), 
    NA_count = sum(is.na(x)), 
    NA_percent = round(sum(is.na(x))/NROW(x),2),
    first_5 = paste0(toString(sort(x, decreasing=TRUE)[1:5]),";"),
    last_5 = paste0(toString(sort(x)[1:5]),";")
  )   
})
do.call(rbind, lst)
...