применить функцию к именам каждого кадра данных, хранящимся в символьном векторе - PullRequest
1 голос
/ 16 октября 2019

У меня есть фреймы данных в моей среде, и я сохранил их имена в символьном векторе.

ldf <- names(which(unlist(eapply(.GlobalEnv,is.data.frame))))

когда я печатаю ldf, его структура похожа на эту:

>ldf
[1] "tdf1"           "tdf2"
[3] "tdf3" 

Я хочу удалить строки, которые имеют много значений na из каждого из этих фреймов данных. Я создал функцию следующим образом:

remna <- function(df) {
  df$countofna <- apply(df[,c(1:length(df))], 1,function(x) sum(is.na(x)))
  df <- df[df$countofna <=3, ]
  df$countofna <- NULL
  df <- df[1:nrow(df)-1, ]
}

Как применить функцию remna к каждому из фреймов данных с именами, хранящимися в ldf. Не используя ldf, я попытался использовать цикл for:

for (i in names(which(unlist(eapply(.GlobalEnv,is.data.frame))))) {
  remna(i)
}

, однако при выполнении remna не удается выполнить следующую ошибку:

Error in df[, c(1:length(df))] : incorrect number of dimensions

Функция remna отлично работает наотдельные кадры данных.

1 Ответ

2 голосов
/ 16 октября 2019

Один из вариантов - загрузить наборы данных в list с помощью mget и использовать rowSums для создания логического вектора для сохранения / удаления строк из каждого набора данных

out <- lapply(mget(ldf), function(dat) dat[rowSums(is.na(dat)) <= 3,, drop = FALSE])

Еслиисходные объекты необходимо обновить, затем используйте list2env (хотя и не рекомендуется)

list2env(out, .GlobalEnv)
...