簡體   English   中英

僅當一個Na時,才將R中的新列中的兩列求和

[英]Sum two columns in a new columns in R only if one Na

我想對兩列求和,假設列為“ 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為a價值,我不想要它。

由於您尚未發布數據集示例,因此讓我首先創建一個。

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)))

我已經組成了兩個向量行以使其可重現,並且因為我不知道您的數據格式,但是我想您會明白的。 如果您使用的是數據框,則用您的列替換是小菜一碟。 在計算長度時,我還假定兩個向量的大小相同。

我在這些示例中進行了循環,因為最近我迷戀於它們,但是我想您也可以創建一個函數並將其應用於向量。

訣竅是知道如何使用邏輯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)

我知道代碼需要適應您的情況,並且可能會有更好的解決方案……但是我認為這可以幫助您繼續進行下去。

使用@RuiBarradas帖子中的示例,另一種選擇是在邏輯矩陣上使用rowSums ,將其轉換為1和NA(對於僅具有NA的行),然后與實際數據集上的rowSums相乘以用NA替換0

(NA^!rowSums(!is.na(etude1))) * rowSums(etude1, na.rm = TRUE)
#[1] 12 12 NA  4 20

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM