如果R中的sum等于零,则替换行值

时间:2017-07-27 04:35:36

标签: r if-statement replace dplyr

如果列的值等于0,我想用NA替换列的值。想象一下以下列:

a b 
0 0
1 5
2 8
3 7
0 0
5 8 

我想通过以下方式替换这些:

a b 
NA NA
1 5
2 8
3 7
NA NA
5 8 

我一直在寻找许多页面的答案,但没有找到任何解决方案。

这是我到目前为止所尝试的内容:

df[ , 31:36][df[,31:36] == 0 ] <- NA    #With df being my dataframe and 31:36 the columns I want to apply the replacement too. 

这将NA替换为等于0的所有值

我还尝试过使用rowSums()的其他替代方案但尚未找到解决方案。

非常感谢任何帮助。

谢谢

2 个答案:

答案 0 :(得分:0)

这个怎么样?

a <- df[31:36,1]
b <- df[31:36,2]
c <- a
a[a+b==0] <- NA
b[c+b==0] <- NA
df[31:36,1] <- a
df[31:36,2] <- b

我们必须创建一个名为c的临时变量,否则当您检查第二列时,您将添加等于NA+0而不是NA的{​​{1}}。< / p>

答案 1 :(得分:0)

使用dplyr执行此操作的惯用方法是:

library(dplyr)

tb <- tibble(
  a = c(0, 1:3, 0, 5), 
  b = c(0, 5, 8, 7, 0, 8)
)

tb <- tb %>%
  # creates a "rowsum" column storing the sum of columns 1:2 
  mutate(rowsum = rowSums(.[1:2])) %>% 
  # applies, to columns 1:2, a function that puts NA when the sum of the rows is 0
  mutate_at(1:2, funs(ifelse(rowsum == 0, NA, .))) %>%
  # removes rowsum
  select(-rowsum)

当您将代码应用到实际表格时,您可以用31:36替换1:2。