【发布时间】:2020-02-24 14:58:46
【问题描述】:
让我们看一个例子。
library(sjmisc)
data(efc)
我想从这个数据集中重新编码名称包含cop 的所有变量(所以我可以使用 tidyselect contains),如下所示。对于男性 (e16sex==1) NA 到 999 和 else=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