【问题标题】:Loop to replace all non-blank values in certain variables in R循环替换R中某些变量中的所有非空白值
【发布时间】:2021-07-03 07:07:07
【问题描述】:

如何运行循环以将单独列表中的变量中的所有 NA 值设置为 FALSE 并将所有非 NA 值设置为 TRUE?

示例数据框:

| var1 | var2 | var3 | var4 |
| --- | --- | --- | --- |
| name | email | NA | b|
| name | email | a| b|
| name | email | a| NA|
| name | email | NA| b|
| name | email | a| b|
| name | email | a| NA|
list.vars <- list("var3", "var4")

示例结果数据框:

| var1 | var2 | var3 | var4 |
| --- | --- | --- | --- |
| name | email | FALSE| TRUE|
| name | email | TRUE| TRUE|
| name | email | TRUE| FALSE|
| name | email | FALSE| TRUE|
| name | email | TRUE| TRUE|
| name | email | TRUE| FALSE|

【问题讨论】:

  • dplyr::mutate(across(list_here, ~ifelse(is.na(.),1,0)) 未经过测试。
  • 您能否与dput 共享您的数据以获得更好的重现性?你的数据是NA 还是chr
  • 如果字符:df %&gt;% mutate(across(unlist(list.vars), ~ifelse(grepl("NA",.),FALSE,TRUE)))

标签: r loops dplyr tidyr na


【解决方案1】:

这行得通吗:

library(dplyr)
df %>% mutate(across(var3:var4, ~ ifelse(is.na(.), FALSE, TRUE)))
  var1  var2  var3  var4
1 name email FALSE  TRUE
2 name email  TRUE  TRUE
3 name email  TRUE FALSE
4 name email FALSE  TRUE
5 name email  TRUE  TRUE
6 name email  TRUE FALSE

使用的数据:

df
  var1  var2 var3 var4
1 name email <NA>    b
2 name email    a    b
3 name email    a <NA>
4 name email <NA>    b
5 name email    a    b
6 name email    a <NA>

【讨论】:

  • 为什么不!df %&gt;% mutate(across(unlist(list.vars), ~ !is.na(.)))
  • 这使用了cross(first(list):last(list) ...谢谢。
【解决方案2】:

假设您的数据框名为df

for (v in list.vars){
  df[[paste0(v,"_result")]] <- df[[v]] %>% is.na() %>% `!`
}

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 2021-08-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2013-07-13
    • 2020-05-16
    相关资源
    最近更新 更多