替换列条件 dplyr

Posted

技术标签:

【中文标题】替换列条件 dplyr【英文标题】:Replace column condition dplyr 【发布时间】:2020-04-03 23:46:51 【问题描述】:
ID <- c("A","B","C","D","E")
AT <- c(0.1,0.2,0.3,0.4,0.5)
US <- c(NA,NA,0.6,NA,NA)
FIGX <- c(1,NA,NA,2,3)
W1 <- c(NA,10,20,30,40)
test.Data <- data.frame(ID,AT,US,FIGX,W1) %>% as.data.table()

我有这种桌子。 如果 NA,我想将 US 列的值替换为 FIGX 的值,如果 FIGX 为 NA,则替换为 W1 列的值。

我试过这个 test.Data %&gt;% mutate_if(is.na(US),mutate_if(is.na(FIGX),W1)) 没有成功。 我该怎么办?

【问题讨论】:

mutate(US = coalesce(US, FIGX, W1)) 这能回答你的问题吗? How to implement coalesce efficiently in R @camille 我会说这不是一个好的骗局 - 那是关于如何编写一个执行 coalesce 的函数(并且早于 dplyr 实现多年)。这个问题是关于在 dplyr 中使用类似coalesce 的函数,问题的根源似乎是mutate_ififelse 之间的混淆。 @IRT,如果您在 mutate、test.Data %&gt;% mutate(ifelse(is.na(US), ifelse(is.na(FIGX), W1, FIGX), US)) 中使用 ifelse,您的尝试会奏效,但 coalesce 是为像这样替换 NAs 而设计的,并且更简洁。如果您想对满足条件的多个列执行完全相同的操作,请使用 mutate_if - 例如,舍入所有数字列,或记录所有严格为正的数字列,或为所有日期列添加一周。 @Gregor 这很公平,尽管 dplyr 函数包含在至少一个答案中。我不认为mutate_if 问题是关键,因为无论如何它都不是正确使用该功能 【参考方案1】:

这是一个带有daa.table 的选项,因为输入数据已经是data.table

library(data.table)
library(dplyr)
test.Data[is.na(US), US := coalesce(FIGX, W1)][]
test.Data
#   ID  AT   US FIGX W1
#1:  A 0.1  1.0    1 NA
#2:  B 0.2 10.0   NA 10
#3:  C 0.3  0.6   NA 20
#4:  D 0.4  2.0    2 30
#5:  E 0.5  3.0    3 40

对于多列,我们可以使用set

colsOfInterest <- c("US", "AT")
for(nm in colsOfInterest)
   i1 <- which(is.na(test.Data[[nm]]))
   set(test.Data, i = i1 ,
         j = nm, value = coalesce(test.Data[["FIGX"]][i1], test.Data[["W1"]][i1]))
  

【讨论】:

coalesce(US, FIGX, W1),不需要case_when 如果我不仅需要为美国而且为所有可能的列(实际上我有 30 列)这样做,如何概括。我一直在寻找循环方式。 嗨,当我执行这些行时,出现错误:Error i set(tmp,i=i1,j=nm,value = coalesce(tmp[["FIGX"]][i1] ,tmp[["W1"]][i1]): 未使用的参数 (tmp[["W1"]][i1])。知道为什么吗? 抱歉,无法复制

以上是关于替换列条件 dplyr的主要内容,如果未能解决你的问题,请参考以下文章

tidyverse 和 dplyr:根据其他列有条件地替换列中的值

使用 dplyr [重复] 有条件地将一列中的值替换为另一列中的值

R dplyr 修改值-替换值

R语言dplyr包na_if函数根据条件将数据对象替换为NA值实战

dplyr 使用条件列和特定行进行变异

R语言dplyr包mutate_if函数修改所有满足条件的数据列的内容实战