Функция не работает одинаково при использовании lapply - PullRequest
0 голосов
/ 21 мая 2018

Прежде всего - я прошу прощения за плохо сформулированный вопрос, если у вас есть какие-либо более подходящие предложения для него, я весь слух!

Я написал функцию, которая добавляет новую переменную в мою df на основекак называется объектНапример, у меня есть x_data, и когда я помещаю его в свою функцию, создается новая переменная с именем x_or_y, в которой все записи отображаются как "x".Вы уже догадались - есть также y_data, что при подключении к функции он создает ту же переменную x_or_y и заполняет ее "y"

Однако у меня возникают некоторые проблемы, когда у менясписок dfs (x_data и y_data), и я использую lapply() для списка - он просто возвращает одну и ту же букву для всех.См. Мой пример ниже.

Пример:

set.seed(123)
x_data <- data.frame(A = rnorm(20),
                 B = rnorm(20))
y_data <- data.frame(A = rnorm(20),
                 B = rnorm(20))

Функция для "x или y":

add_x_or_y  <- function(z) {
  z$x_or_y <- ifelse(grepl(pattern = "x", 
                                 deparse(substitute(z)), fixed = TRUE), 
                           "x", "y")
  z
}

Итак, пробуем функцию самостоятельно:

head(add_x_or_y(x_data),3)

            A          B x_or_y
1 -0.56047565 -1.0678237      x
2 -0.23017749 -0.2179749      x
3  1.5587083 -1.0260044       x

head(add_x_or_y(y_data),3)

           A          B x_or_y
1 -0.6947070  0.3796395      y
2 -0.2079173 -0.5023235      y
3 -1.2653964 -0.3332074      y

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

x_y_list <- list(x_data = x_data,
                 y_data = y_data)
x_y_list <- lapply(x_y_list, add_x_or_y)

head(x_y_list$x_data,3)
           A          B x_or_y
1 -0.5604756 -1.0678237      y
2 -0.2301775 -0.2179749      y
3  1.5587083 -1.0260044      y

head(x_y_list$y_data,3)
           A          B x_or_y
1 -0.6947070  0.3796395      y
2 -0.2079173 -0.5023235      y
3 -1.2653964 -0.3332074      y

Это не сработало!:( Первый должен иметь "x" в переменной x_or_y. Я уверен, что это действительно очень простое решение, но я не могу его найти - помогите Stack Overflow!

1 Ответ

0 голосов
/ 22 мая 2018

Если вы используете lapply, вы просто передаете фреймы данных без их имен.Возможно, если вы измените подход alittle:

set.seed(123)
x_data <- data.frame(A = rnorm(20),
                     B = rnorm(20))
y_data <- data.frame(A = rnorm(20),
                     B = rnorm(20))

add_x_or_y <- function(df, df_name) {
  df$x_or_y <- ifelse(grepl("x", df_name) == TRUE, "x", "y")
  df
}

x_y_list <- list(x_data = x_data,
                 y_data = y_data)

x_y_list <- mapply(add_x_or_y, 
                   x_y_list, 
                   names(x_y_list), SIMPLIFY = FALSE)

head(x_y_list$x_data, 3)
head(x_y_list$y_data, 3)
...