Передача аргумента столбца и фрейма данных в мою функцию в lapply ()? - PullRequest
0 голосов
/ 24 октября 2019

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

#dataframe is called kstarter
my_func(df, col) {
 ...
}
lapply(kstarter, arg1=kstarter, arg2=??)

Но я не могу заставить его работать. Как arg2 может ссылаться на каждый столбец, который повторяется? Я ценю вашу помощь!

Редактировать:

Функция, которую я хочу применить для использования:

get_col_info <- function(col, df) {
  unique_vals <- df %>% 
    select(col) %>%
    distinct() 
  num_u_vals <- nrow(unique_vals)
  if (is.numeric(df[[col]])) {
    return(list(
      min = min(df[[col]]),
      max = max(df[[col]]),
      mean = mean(df[[col]])
    ))
  } else if ((!is.numeric(df[[col]])) & num_u_vals < 10) {
    return(list(
      n_values = num_u_vals,
      unique_values = unique_vals %>% pull()
    ))
  } else if (!is.numeric(df[[col]]) & num_u_vals >= 10) {
    return(list(
      n_values = num_u_vals,
      sample_values = sample(df[[col]], size=10)
    ))
  }
}

get_col_info должна принимать имя столбца и фрейм данных в качестве параметров. Я хочу создать список, который получает информацию col для каждого столбца в кадре данных, используя lapply, что-то вроде list <- lapply(kstarter, get_col_info(current_col, kstarter)), но я не могу понять синтаксис. Пожалуйста, помогите!

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Когда вы используете lapply в кадре данных, он автоматически зацикливается на столбцах. Вот пример использования набора данных iris, но если вы предоставите нам какой-нибудь воспроизводимый пример, я мог бы адаптировать его к вашим данным.

lapply(iris, mean)

Вместо функции mean вы можете использовать свой собственный. пользовательская анонимная функция, такая как:

lapply(iris, function(column){
  rtn=mean(column, na.rm=T)
  return(rtn)
})

Или ваша встроенная функция, подобная этой:

my_func = function(column){
  rtn=mean(column, na.rm=T)
  return(rtn)
}
lapply(kstarter, myfunc)

Кроме того, я бы посоветовал вам поискать функцию map из purrrпакет, так как это дает вам лучший контроль над типом возвращаемого значения. Например, purrr::map(kstarter, myfunc) вернет list, а purrr::map_df(kstarter, myfunc) вернет data.frame.

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

Проблема начинается с того, как вы определяете свою функцию. Ваша функция должна принимать столбец (или вектор) как переменную. Это небольшое дополнение к тому, что @DanChaltiel опубликовал. Вы можете это так:

library(tidyverse)

df = data.frame(
 A=sample(1:10,20,replace=T),
 B=sample(1:10,20,replace=T),
 C=sample(letters,20,replace=T),
 D=rep(letters[1:4],5)
)
# slightly modified your function
# but you can clean it up more
# a lot of redundancy 
get_col_info <- function(col) {
  num_u_vals <- n_distinct(col)
  if (is.numeric(col)) {
    return(list(
      min = min(col),
      max = max(col),
      mean = mean(col)
    ))
  } else if ((!is.numeric(col)) & num_u_vals < 10) {
    return(list(
      n_values = num_u_vals,
      unique_values = unique(col)
    ))
  } else if (!is.numeric(col) & num_u_vals >= 10) {
    return(list(
      n_values = num_u_vals,
      sample_values = sample(col, size=10)
    ))
  }
}
## as Dan Chaltiel suggested
lapply(df,get_col_info)
## or purrr
df %>% map(get_col_info)
...