[英]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
添加一個條件來檢查列中的all
值if
都是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.