仅当一个Na

时间:2017-11-03 15:08:04

标签: r if-statement statistics apply rowsum

我想总结两列,让我们说列“apinten”和“apmod”。如果两列中只有一列中有Na,我希望R忽略Na,但如果两列是Na,我想报告“Na”...目前我做了:

etude1<-within(etude1,{mvpascore<-rowSums(cbind(apinten,apmod), na.rm = T, dims = 1)})

和它

etude1<-within(etude1,{mvpascore<-apply(cbind(apinten,apmod), 1, sum, na.rm = TRUE)})

使用这些命令,如果只有一个缺失,R只报告新列中另一个的值,但如果两个列apinten和apmod都是Na,则R在新闻列中报告值“0”... 0是一个值,我不想要它。

3 个答案:

答案 0 :(得分:2)

由于您尚未发布数据集示例,请先创建一个。

etude1 <- data.frame(apinten = 1:5, apmod = 11:15)
etude1$apinten[2:3] <- NA
etude1$apmod[3:4] <- NA

现在只是apply数据框每一行的匿名函数。该函数确定所有行值是否为NA,如果不是,则对它们求和。

etude1$mvpascore <- apply(etude1, 1, function(x)
                       ifelse(all(is.na(x)), NA, sum(x, na.rm = TRUE)))

答案 1 :(得分:0)

我已经制作了两个向量行以使其可重现,因为我不知道数据的格式,但我想你会得到这个想法。如果您使用数据框,则用您的列替换是一件小事。我还假设在计算长度时两个矢量的大小相同。

我在这些例子中寻找一个循环,因为最近我对它们很着迷,但我想你也可以创建一个函数并将它应用到你的向量中。

诀窍是知道如何使用逻辑XOR函数,它提供了所需的输出。

apinten<-as.vector(c(NA,0,1,NA))
apmod<-as.vector(c(0,NA,1,NA))
sum_vector<-as.vector(c())
vector_length<-length(apinten)

for (i in 1:vector_length){
  if (xor(is.na(apinten[i]),(is.na(apmod[i])))){
    sum_vector[i]<-sum(apinten[i],apmod[i],na.rm = TRUE)}

  else{sum_vector[i]<-sum(apinten[i],apmod[i],na.rm = FALSE)}  
}

您可以检查输出sum vector(0,0,2,NA)

我知道代码需要适应你的情况,并且可能有更好的解决方案......但我认为这可以帮助你继续。

答案 2 :(得分:0)

使用@RuiBarradas帖子中的示例,另一个选项是在逻辑矩阵上使用rowSums,将其转换为1和NA(对于只有NA的行),然后乘以{{1}在实际数据集上用rowSums替换0

NA