簡體   English   中英

如何通過放置NA來混合兩列?

[英]how to blend two columns by stubsituting NA's?

我有一個巨大的數據框,其中有兩列需要合並。 在可能不知道這是不是一樣的問題mentionend在這個崗位在這里 ,但我其實沒有按數據幀僅僅兩列的”存在。 還有更多的東西(有很多NA),我只想處理其中的兩個,這使它變得更加復雜。

這是這些列的一部分:

    col1 col2
15   NA    4
16   NA    5
17   NA    5
18   NA    5
19   NA    1
20   NA   NA
21   NA   NA
22   1    NA
23   5    NA
24   2    NA
25   4    NA
26   3    NA
27   NA    2
28   NA    4
29   NA    5
30   NA    3

我需要通過替換彼此的NA將列合並為一列。 當兩列都包含NA時,不會發生前置(但這很明顯)。

結果應如下所示:

    col1
15   4    
16   5  
17   5  
18   5  
19   1  
20   NA 
21   NA 
22   1  
23   5  
24   2  
25   4  
26   3  
27   2  
28   4  
29   5  
30   3  

我嘗試了一個難看的循環:

for (i in 1:nrow(df)){
  if (is.na(df[i,1])==TRUE){
    df[i,1] <- df[i,2]
  }
 }
df <- df[,1]

但是該代碼似乎太慢了。 有誰知道兩個人如何處理這個問題?

提前謝謝了!

無需循環,因為您可以分配給子集:

df$col1[is.na(df$col1)] <- df$col2[is.na(df$col1)]

諸如SQL之類的語言具有一個稱為coalesce的函數,該函數在給定一組列表的情況下返回第一個非缺失值。 我寫了一個函數在R中執行此行為。

coalesce<-function(...) {
    x<-lapply(list(...), function(z) {if (is.factor(z)) as.character(z) else z})
    m<-is.na(x[[1]])
    i<-2
    while(any(m) & i<=length(x)) {
        if ( length(x[[i]])==length(x[[1]])) {
            x[[1]][m]<-x[[i]][m]
        } else if (length(x[[i]])==1) {
            x[[1]][m]<-x[[i]]
        } else {
            stop(paste("length mismatch in argument",i," - found:", length( x[[i]] ),"expected:",length( x[[1]] ) ))
        }
        m<-is.na(x[[1]])
        i<-i+1
    }
    return(x[[1]])
}

你會用它像

coalesce(col1,col2)

如果所有行均不適用,您還可以添加默認值

coalesce(col1,col2, -9)

它返回一個新列,而不是修改任何原始列。

我試圖在此要點上保留該功能的最新版本

暫無
暫無

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

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