簡體   English   中英

如何在 r 中將包含 NA 的行合並為一個?

[英]How to merge rows that contain NAs into one in r?

這是我的數據:

data<-structure(c(1, NA, 2, NA, NA, 9), .Dim = 2:3, .Dimnames = list(
    c("1", "2"), NULL), .Names = c("1", "2", NA, NA, NA, NA))

我的每一行都有 NA,但行彼此對應(如果一行有 NA,則同一列中的另一行有一個值)

  [,1] [,2] [,3]
1    1    2   NA
2   NA   NA    9

這是所需的 output:

   [,1] [,2] [,3]
1    1    2    9



structure(c(1, 2, 9), .Dim = c(1L, 3L), .Dimnames = list("1", 
    NULL))

嚴格假設每一列的非NA值的數量相同,可以做到

t(apply(data, 2, na.omit))
#      [,1] [,2] [,3]
# [1,]    1    2    9

對於這個例子,對t(..)的需求是不同的,因為apply here將自動簡化為向量,而不是數組。 如果您的數據產生兩個以上的非NA值,那么您可以不使用t(..)

data <- rbind(data, data)
data
#   [,1] [,2] [,3]
# 1    1    2   NA
# 2   NA   NA    9
# 1    1    2   NA
# 2   NA   NA    9
apply(data, 2, na.omit)
#      [,1] [,2] [,3]
# [1,]    1    2    9
# [2,]    1    2    9

@akrun 提出了一個很好的觀點:如果一列都是NA ,這將失敗。 這是一個輕微的修復:

apply(data, 2, function(z) { out <- na.omit(z); if (!length(out)) NA else out; })
#      [,1] [,2] [,3]
# [1,]    1    2    9
# [2,]    1    2    9

添加一個條件來檢查列中的allif都是NA ,然后返回NA else刪除NA也可能很好

sapply(asplit(data, 2), function(x) if(all(is.na(x))) NA_real_
         else x[complete.cases(x)])

試試colSums

> t(colSums(data, na.rm = TRUE))
     [,1] [,2] [,3]
[1,]    1    2    9

暫無
暫無

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

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