【问题标题】:R for loop to filter and print columns of a data frameR for循环过滤和打印数据框的列
【发布时间】:2021-11-21 19:39:38
【问题描述】:

我提出的类似问题似乎并不完全适用于我想要完成的工作,并且在最相似的问题之一中提供的答案中至少有一个没有正确提供实际有效的解决方案。

所以我有一个数据框,可以说类似于以下内容。

sn <- 1:6
pn <- letters[1:6]
issue1_note <- c(“issue”,”# - #”,NA,”sue”,”# - #”,”ISSUE”)
issue2_note <- c(“# - #”,”ISS”,”# - #”,NA,”Issue”,”Tissue”)
df <- data.frame(sn,pn,issue1_note,issue2_note)

这就是我想要做的。我希望能够快速轻松地直观地检查每个 _note 列。我知道我可以使用select()filter() 在每一列上执行此操作,如

df %>% select(issue1_note) %>%
filter(!is.na(issue1_note) & issue1_note != “# - #”)

但是,我的真实数据中有大约 30 列和 300 行,我不想每次都这样做。

我想编写一个 for 循环,它将在所有列中执行此操作。我还希望单独打印每一列。我尝试以下方法仅删除 NA,但它仅选择并打印列。就好像它完全跳过了过滤一样。

col_notes <- df %>% select(ends_with(“note”)) %>% colnames()

for(col in col_notes){
df %>% select(col) %>% filter(!is.na(col)) %>% print()
}

关于如何让这个也过滤的任何想法?

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

    我能够通过更多研究找到解决方案,尽管它不涉及 for 循环。我创建了一个自定义函数,然后使用了 lapply。如果有人想知道,这是我的解决方案。

    my_fn <- function(column){
    tmp <- df %>% select(column)
    tmp %>% filter(!is.na(.data[[column]]) & .data[[column]] != “# - #”)
    }
    
    lapply(col_notes, my_fn)
    

    感谢您的考虑。

    【讨论】:

      【解决方案2】:

      这可以通过filter/acrossfilter/if_any/filter_if_all` 一次性完成,具体取决于所需的结果

      library(dplyr)
      df %>% 
         filter(across(ends_with('note'), ~ !is.na(.) & . != "# - #"))
      

      这将在其列名中以“note”作为后缀的所有列中返回没有 NA 或“# - #”的行。如果我们要返回至少一列非 NA,请使用 if_any

      df %>%
          filter(if_any(ends_with("note"), ~ !is.na(.) & . != "# - #"))
      

      【讨论】:

      • 感谢您的回复,但您的回答并未提供我想要的内容。与我的示例数据一起使用会产生一个 1 行数据框(原始数据中只有第 6 行),因为它会过滤掉其他所有内容。我想保留并显示所有不是我要过滤掉的值,而不是过滤掉一列的整行具有不需要的值。 if_any 只过滤掉了原始df的第3行。虽然稍长一些,但自定义函数和 lapply 的组合完全符合我的要求。
      • @joerminer 你的意思是过滤器应该是完全独立的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多