代码之家  ›  专栏  ›  技术社区  ›  Dr. Fabian Habersack

减去R数据帧中的列,但在另一个为NA时保留var1或var2的值

  •  0
  • Dr. Fabian Habersack  · 技术社区  · 6 年前

    假设这是我的数据(列) a b )和列 c 是我想要的,即 a - b 但是保持 什么时候 b==NA 反之亦然:

       a    b    c
    1  2    1    1
    2  2   NA    2
    3 NA    3    3
    4 NA   NA   NA
    

    现在我尝试了不同的方法,但大多数情况下,当至少有一列是NA时,它返回NA。例如:

    matrixStats::rowDiffs(data, na.rm=T) # only works for matrix-format, and returns NA's
    
    dat$c <- dat$a - dat$b + ifelse(is.na(dat$b),dat$a,0) + ifelse(is.na(dat$a),dat$b,0) # seems like a desparately basic solution, but not even this does the trick as it also returns NA's
    
    apply(dat[,(1:2)], MARGIN = 1,FUN = diff, na.rm=T) # returns NA's
    
    dat$b<-dat$b*(-1)
    dat$c<-rowSums(dat,na.rm=T) # this kind of works but it's a really ugly workaround
    

    dplyr 解决方案,请分享你的知识。我甚至不知道该怎么做。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Saurabh Chauhan    6 年前

    如果 df$b NA 然后简单地把 df$a df$年 不适用 十亿德国法郎 df$a-df$b

    df$c=ifelse(is.na(df$b),df$a,ifelse(is.na(df$a),df$b,df$a-df$b))
    

    输出:

    df
       a  b  c
    1  2  1  1
    2  2 NA  2
    3 NA  3  3
    4 NA NA NA
    
        2
  •  1
  •   Tim Biegeleisen    6 年前

    你可以试着用 coalesce dplyr 包裹:

    dat <- data.frame(a=c(2, 2, NA, NA), b=c(1, NA, 3, NA))
    dat$c <- coalesce(dat$a - coalesce(dat$b, 0), dat$b)
    dat$c
    
       a  b  c
    1  2  1  1
    2  2 NA  2
    3 NA  3  3
    4 NA NA NA
    

    a b NA . 如果整个表达式仍然是 不适用 ,那么它意味着 也是 ,在这种情况下 b类 .

        3
  •  0
  •   akrun    6 年前

    这里有一个选项 base R replace 这个 NA 包含0的元素, Reduce 它是一个单一的 vector 通过获取行差异并更改包含所有行的行 不适用 不适用

    df1$c <- abs(Reduce(`-`, replace(df1, is.na(df1), 0))) *
                   NA^ (!rowSums(!is.na(df1)) )
    df1$c
    #[1]  1  2  3 NA
    

    data.table

    library(data.table)
    setDT(df1)[!is.na(a) | !is.na(b), c := abs(Reduce(`-`, 
                   replace(.SD, is.na(.SD), 0)))]
    

    数据

    df1 <- structure(list(a = c(2L, 2L, NA, NA), b = c(1L, NA, 3L, NA)), 
     row.names = c("1", "2", "3", "4"), class = "data.frame")