Как перебрать несколько кадров данных в R? - PullRequest
0 голосов
/ 21 февраля 2020

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

Я пытался сделать это несколькими способами:

Например:

df <- list(df1,df2,df3,df4,df5,df6,df7,df8,df9,df10,df11,df12)

for (i in 1:length(df)){
  df[i] <- na.omit(df[i])
}

И вот так:

for (df in list(df1,df2,df3,df4,df5,df6,df7,df8,df9,df10,df11,df12)){
  df <- na.omit(df)
}

Ни один из этих методов не сработал:)

Может кто-нибудь, пожалуйста, дайте мне знать, чего здесь не хватает, чтобы правильно повторять несколько фреймов данных?

1 Ответ

2 голосов
/ 21 февраля 2020
df1 <- df2 <- data.frame(a=c(NA, 1), b=1:2)
dfs <- list(df1, df2)
dfs[] <- lapply(dfs, na.omit)

Что касается того, почему они не работают:

dfs <- list(df1, df2)
for (i in 1:length(dfs)){
  dfs[i] <- na.omit(dfs[i])
}

Здесь вы используете подмножество в одну квадратную скобку, которое возвращает список, а затем вызывает na.omit для списка длиной 1 где элемент 1 является первым df. Поскольку df не NA, он возвращается как есть. ie,

dfs[1]
#[[1]]
#   a b
#1 NA 1
#2  1 2

И ...

for (df in list(df1, df2)) {
  df <- na.omit(df)
}

Здесь вы перебираете df, но сохраняете результат каждого в df. R на самом деле не обрабатывает ссылки (все копируется при записи), поэтому df сохраняет результат na.omit(df1) после первой итерации и результат na.omit(df2), когда заканчивается l oop.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...