【问题标题】:Create variable that captures if there are missing fields in 4 string variables创建捕获 4 个字符串变量中是否缺少字段的变量
【发布时间】:2021-01-25 00:05:36
【问题描述】:

我正在创建虚拟变量,其中缺失值为 1,非缺失值为 0。缺失值为 NA,即:

NA
NA
Positive
NA
Negative

我的代码一次一个变量成功地创建了虚拟变量:

library(dplyr)

#create new dummy variable
df <- mutate(df, newvar = ifelse(is.na(var1), 1,0))

#check
sum(df$newvar == 1)

我有 4 个字符串变量,想创建一个新的虚拟变量,其中任何变量中的缺失值为 1,非缺失值为 0。我尝试重用上述代码:

mylist <- c("var1", "var2", "var3", "var4")

for(i in mylist){
  df <- mutate(df, newvar = ifelse(is.na(i), 1,0))
}

我知道我错误地使用了for 循环,但这是正确的方法,还是我应该做一些不同的事情?

【问题讨论】:

  • 请为变量df 提供虚拟数据。我们无法说出“缺失值”是什么意思。这些空字符串是""NA 还是NULL?另外,您是否使用来自dplyrmutate?如果是这样,请使用dplyr::mutate(...) 明确这一点,或者将此行添加到您的代码library(dplyr)。否则,您的代码将不适用于其他人。
  • 谢谢,我编辑了请求以反映这些 cmets。缺失值为NA。希望澄清

标签: r string for-loop missing-data dummy-variable


【解决方案1】:

我们可以使用mutateacross

library(dplyr) # version >= 1.0.0  
df <- df %>%
          mutate(across(all_of(mylist), ~ +(is.na(.)), .names = '{col}_newvar'))

如果我们有更早的版本,请使用mutate_at

df %>%
   mutate_at(vars(mylist), ~  +(is.na(.)))

如果我们需要创建一个新列来标记“mylist”中的这些列中是否存在任何缺失值

df1 <- df %>%
    mutate(newvar = +(rowSums(is.na(select(., all_of(mylist)))) > 0))

【讨论】:

  • 我想我一定是在这里误解了一些东西,因为当我运行它时它返回全零。 ~ 是运算符吗?我试图搜索它,但找不到任何东西。
  • @JSCarp 你能检查packageVersion('dplyr')使用的版本> 1.0.0
  • 我检查并正在运行版本 1.0.2。我收到的具体错误消息是“未知或未初始化的列:newvar.[1] 0”
  • @JSCarp 对我来说,这是一个可重复的示例data(iris); nm1 &lt;- names(iris)[1:4]; head(iris) %&gt;% mutate(across(all_of(nm1), ~ +(is.na(.))))
  • 抱歉,您提供的第一个代码有效,它为我列表中的 4 个变量中的每一个创建了一个虚拟变量。我只是感到困惑,因为我想创建一个虚拟变量来解释列表中所有变量中的缺失值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2019-09-02
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多