Использование одной и той же функции в нескольких наборах данных и использование определенных столбцов - PullRequest
0 голосов
/ 17 октября 2019

У меня есть 8 наборов данных, и я хочу применить функцию для преобразования любого числа меньше 5 в NA для 3 столбцов (var1, var2, var3) каждого набора данных. Как я могу написать функцию, чтобы сделать это эффективно и быстрее? Я прошел через множество таких вопросов о переполнении стека, но не нашел ответа, где использовались конкретные столбцы. Я написал функцию для замены, но не могу понять, как применить ко всем наборам данных.

Input:
Data1
variable1 variable2 variable3 variable4
10           36        56        99
15           3         2         56
4            24        1         1

Expected output:
variable1 variable2 variable3 variable4
10           36         56        99
15           NA         NA        56
NA           24        NA         1

Выполните то же самое для еще 7 наборов данных.

До сих пор я сохранил необходимыепеременные и наборы данных в двух разных списках.

var1=enquo(variable1)
var2=enquo(variable2)
var3=enquo(variable3)
Total=3


listofdfs=list()
listofdfs_1=list()
for(i in 1:8) {
  df=sym((paste0("Data",i)))
listofdfs[[i]]=df
  }

for(e in 1:Ttoal) {    
listofdfs[[e]]= eval(sym(paste0("var",e)))
}

Выбранные столбцы будут проходить через эту функцию:

temp_1=function(x,h) {
  h=enquo(h)
  for(e in 1:Total) {    
  if(substr(eval(sym(paste0("var",e))),1,3)=="var") {
 y= x %>% mutate_at(vars(!!h), ~ replace(., which(.<=5),NA))
 return(y)
  }

}
}

Я ожидал чего-то:

lapply (для каждоговыбранные столбцы набора данных, temp_1)

Ответы [ 2 ]

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

Вот простой подход, который должен работать:

cols_to_edit = paste0("var", 1:3)
result_list = lapply(list_of_dfs, function(x) {
  x[cols_to_edit][x[cols_to_edit] < 5] = NA
  return(x)
})

Я предполагаю, что ваши начальные данные находятся в списке с именем list_of_dfs, что имена столбцов для редактирования одинаковы во всех фреймах данных, ичто вы можете создать символьный вектор cols_to_edit с этими именами.

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

Вот решение проблемы в вопросе.
Прежде всего, создайте набор тестовых данных.

createData <- function(Total = 3){
  numcols <- Total + 1
  set.seed(1234)
  for(i in 1:8){
    tmp <- replicate(numcols, sample(10, 20, TRUE))
    tmp <- as.data.frame(tmp)
    names(tmp) <- paste0("var", seq_len(numcols))
    assign(paste0("Data", i), tmp, envir = .GlobalEnv)
  }
}

createData()

Теперь, преобразование данных.
Это намного проще, еслимножество фреймов данных находятся в "list".

df_list <- mget(ls(pattern = "^Data"))

. Я представлю решения, решение на основе R и решение на tidyverse. Обратите внимание, что оба решения будут использовать функцию temp_1, записанную только в базе R.

library(tidyverse)

temp_1 <- function(x, h){
  f <- function(v){
    is.na(v) <- v <= 5
    v
  }
  x[h] <- lapply(x[h], f)
  x
}

h <- grep("var[123]", names(df_list[[1]]), value = TRUE)

df_list1 <- lapply(df_list, temp_1, h)
df_list2 <- df_list %>% map(temp_1, h)

identical(df_list1, df_list2)
#[1] TRUE
...