0

我想将两列相加,假设列“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 是价值,我不想要它。

4

3 回答 3

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)))
于 2017-11-03T16:03:43.417 回答
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)

我知道代码需要对您的情况进行一些调整,并且可能有更好的解决方案......但我认为这可以帮助您继续。

于 2017-11-03T16:02:20.263 回答
0

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

(NA^!rowSums(!is.na(etude1))) * rowSums(etude1, na.rm = TRUE)
#[1] 12 12 NA  4 20
于 2017-11-04T03:49:43.273 回答