【问题标题】:For loop doesn't properly filterFor 循环没有正确过滤
【发布时间】:2019-03-01 01:39:29
【问题描述】:

我想打印两个数据帧,其中第一个是列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 != "") 并收到了相同的结果。

【问题讨论】:

    标签: r for-loop dplyr


    【解决方案1】:

    至于为什么投反对票,我不知道,但我可以猜到。您使用了不是基本 R 的函数,而没有对包含它们的包发出 library 调用,并且您不必要地使用 cbind 和 as.data.frame 以一种浪费且可能危险的方式构造了示例数据帧,其中单个 @987654323 @call 会更高效、更安全、更有表现力。

    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()
    }
    

    【讨论】:

    • 好奇,R 大师先生,为什么 cbind 的向量会被投射到数据框 dangerous
    • 因为它会导致向量失去它们的属性。如果参数还不是数据框,那么它会生成一个矩阵。同样,在向量周围不必要地使用c 会导致它们失去属性。我们看到新手将cbind 放入data.frame(或在本例中为as.data.frame),但这通常会导致代码中的模糊错误。在这种情况下,这不是问题的原因,但我的猜测是反对者认为代码对于未来的用户来说是一个“坏”的例子。
    【解决方案2】:

    你的意思是这样的:

    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
    

    【讨论】:

    • 是的,除非我想在 dplyr 命令中的 for 循环中执行此操作。
    猜你喜欢
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多