Цикл не правильно фильтрует - PullRequest
0 голосов
/ 01 марта 2019

Я хочу напечатать два кадра данных, где первый - это все строки, где столбец a - не NA, а второй - все строки, где столбец b - не NA.

Это мой код.Он печатает весь фрейм данных оба раза, не вызывая фильтр.

a <- cbind(rep(NA, 100), seq(0,99)) 
b <- cbind(seq(0,99), rep(NA, 100))
df <- as.data.frame(rbind(a,b))
names(df) <- c("a", "b")


columns <- c("a", "b")

for (j in columns){
  df %>% filter(!is.na(j)) %>% print()
}

Я также пробовал с filter(j != "") и получил тот же результат.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Что касается понижения, я не могу знать, но я могу догадаться.Вы использовали функции, которые не являются базовыми R, без выдачи library вызовов для пакетов, которые их содержат, и вы создали свой примерный фрейм данных расточительным и, возможно, опасным образом, используя без необходимости cbind и as.data.frame, где один data.frame звонок был бы эффективнее, безопаснее и выразительнее.

cbind(as.Date("1970-01-01"))   # causes loss of attributes including class
#     [,1]
#[1,]    0
c(factor("a"))
#[1] 1

Вот как правильно создать пример, подобный вашему:

df <- data.frame( a = c(rep(NA, 100), seq(0,99)) , 
                   b = c(seq(0,99), rep(NA, 100)))

И вы можете получить столбец или объект, имя которого у вас есть в векторе символов, с помощью get (при условиичто есть соответствующий

columns <- c("a", "b")
library(dplyr)
for (j in columns){
    df %>% filter(!is.na( get(j) )) %>% print()
}
0 голосов
/ 01 марта 2019

Вы имеете в виду что-то вроде:

not_na_a <- data.frame(which(!is.na(df$a)))

#> head(not_na_a)
  which..is.na.df.a..
1                 101
2                 102
3                 103
4                 104
5                 105
6                 106



not_na_b <- data.frame(which(!is.na(df$b)))

#> head(not_na_b)
  which..is.na.df.b..
1                   1
2                   2
3                   3
4                   4
5                   5
6                   6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...