【问题标题】:How to recode multiple variables at once with an else=copy option depending on another variables condition in R?如何根据 R 中的另一个变量条件使用 else=copy 选项一次重新编码多个变量?
【发布时间】:2020-02-24 14:58:46
【问题描述】:

让我们看一个例子。

library(sjmisc)
data(efc)

我想从这个数据集中重新编码名称包含cop 的所有变量(所以我可以使用 tidyselect contains),如下所示。对于男性 (e16sex==1) NA999else=copy (就像我可以使用 sjmisc::rec(..., rec = "NA=999; else=copy" 一样);对于女性 (e16sex==2),请保持原样。

我尝试通过dplyr(和sjmisc)进行下一个幼稚测试:

mutate_at(efc, vars(contains("cop")), list(~if_else(e16sex == 1, rec(., rec="NA=999; else=copy"),.)))

但是,可以理解的是,if_else 不会处理第二个点 .,就好像它是带有 e16sex != 1 的行的原始 contains("cop") 变量一样。

我正在寻找一个函数(或复合)返回一个指定重新编码的数据帧(所以,请避免for)。我无法尝试使用data.table,因为我还不知道该语言,但欢迎所有有效(和高效)的解决方案。也许可以用purrr 完成?

谢谢!

更新

上面的幼稚测试有效。我没有用这个例子尝试过,但是用iris 数据集,用Species 变量而不是copvariables。由于Species 是因素,试图通过一个新的来改变它的一些水平产生NA's,因此我很困惑。

【问题讨论】:

  • 试试case_when 这些更复杂的 if-else 语句。
  • 我知道case_when,但我不明白如何用它解决上面if_else 的问题,也就是说,如何说保持多个变量相同。?
  • 对不起,我误解了这个问题。
  • 你能提供一些示例数据,这样我们就不用安装包了吗?也许你在找cols <- grep("cop", names(efc), value=TRUE); setDT(efc)[e16sec==1L, (cols) := lapply(.SD, function(x) fcoalesce(x, 999L)), .SDcols=cols]

标签: r dplyr data.table purrr recode


【解决方案1】:

我不确定我是否完全理解这个问题,但您可以为此使用 for 循环:

for(x in grep( "cop",names(efc))) { 
   efc[!is.na(efc$e16sex) & efc$e16sex==1 & is.na(efc[,x]),x] <- 999 
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 2022-11-28
    • 2021-10-12
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多