Создавайте векторы в lappy (или l oop) - PullRequest
0 голосов
/ 11 июля 2020

Я хотел бы l oop функцию над вектором символов. Функция создаст вектор или список, и имя каждого вектора (списка) будет взято из вектора символов. Например.

# The data would look like:
fist second third
1    2     3
1    NA    3
1    2     3
1    2     NA
NA   2     3

# I want to create three lists/vectors such as

first <- c("1.pdf", "1.pdf", "1.pdf", "1.pdf")
second <- c("2.pdf", "2.pdf", "2.pdf", "2.pdf")
third <- c("3.pdf", "3.pdf", "3.pdf", "3.pdf")

# where, first, second, third, now are the names of the vectors. I tried the following way. 

vector_names <- c("first", "second", "third")

cleanNA <- function(x){
  x <- as.character(as.data.frame(t(data[paste0(x)])))
  x <- na.omit(x) # remove all NA observations.
  x <- paste0(x, ".pdf")
  return(x)
}
# I can do this by a vector length 1. 

name <- c("first")
assign(name, namef)
namef <- createlists(name)

# But once I do an lapply, it won't create the three vectors as I wanted. The lapply does run and returns what I want, but not create the three vectors. 

lapply(vector_names, cleanNA)

Я много раз искал этот тип вопросов и чувствую, что R на самом деле не обеспечивает хороший способ сгенерировать новый вектор в al oop. Я прав? Спасибо.

1 Ответ

1 голос
/ 11 июля 2020

Вот упрощенная версия:

cleanNA <- function(data, x){
   x <- data[[x]]
   x <- na.omit(x) 
   x <- paste0(x, ".pdf")
   return(x)
   #Or a one-liner
   #paste0(na.omit(data[[x]]), '.pdf')
}

list_vec <- lapply(vector_names, cleanNA, data = data)
list_vec

#[[1]]
#[1] "1.pdf" "1.pdf" "1.pdf" "1.pdf"

#[[2]]
#[1] "2.pdf" "2.pdf" "2.pdf" "2.pdf"

#[[3]]
#[1] "3.pdf" "3.pdf" "3.pdf" "3.pdf"

Лучше хранить данные в списке, чтобы им было легче управлять и чтобы избежать создания большого количества объектов в глобальной среде. Однако, если вы хотите, чтобы они были отдельными векторами, вы можете использовать list2env:

list_vec <- setNames(list_vec, vector_names)
list2env(list_vec, .GlobalEnv)

data

data <- structure(list(first = c(1L, 1L, 1L, 1L, NA), second = c(2L, 
NA, 2L, 2L, 2L), third = c(3L, 3L, 3L, NA, 3L)), class = "data.frame",
row.names = c(NA, -5L))
...