我想总结两列,让我们说列“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是一个值,我不想要它。
答案 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