我正在嘗試計算多列資料中 NA 的數量。這是一個可重現的示例。
structure(list(V2QE38A = c(1, 0, 1, 0, 1, 1, 1, 0, 1, 0), V2QE38B = c(0,
0, 0, 0, 0, 1, 0, 0, 0, 0), V2QE38C = c(1, 1, 0, 3, 2, 0, 0,
3, 1, 1), V2QE38D = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA,
10L), class = "data.frame")
我嘗試了兩種方法:第一種:
dt %>% select(starts_with("V2QE38")) %>% colSums(is.na(.))
這給了我一些結果(簡而言之,我在某些列中有 NA)然后我嘗試了另一個結果:
colSums(is.na(dt[,c("V2QE38A", "V2QE38B", "V2QE38C", "V2QE38D")]))
我在任何這些列中都沒有發現 NA。
我認為第二個結果是正確的。但我只是想知道我做錯了什么才能得到第一個結果?謝謝!
uj5u.com熱心網友回復:
在第一種情況下,傳遞了多個函式。我們可能需要阻止它{}
library(dplyr)
dt %>%
select(starts_with("V2QE38")) %>%
{colSums(is.na(.))}
V2QE38A V2QE38B V2QE38C V2QE38D
0 0 0 0
或者有另一個 %>%
dt %>%
select(starts_with("V2QE38")) %>%
is.na %>%
colSums
-輸出
V2QE38A V2QE38B V2QE38C V2QE38D
0 0 0 0
問題是colSums首先執行而不評估is.na
> dt %>%
select(starts_with("V2QE38")) %>%
colSums(.)
V2QE38A V2QE38B V2QE38C V2QE38D
6 1 12 0
這與 OP 的輸出相同 colSums(is.na(.))
uj5u.com熱心網友回復:
使用sapply和匿名函式的基本解決方案function(x){sum(is.na(x))}:
data = structure(list(V2QE38A = c(1, 0, 1, 0, 1, 1, 1, 0, 1, 0), V2QE38B = c(0,
0, 0, 0, 0, 1, 0, 0, 0, 0), V2QE38C = c(1, 1, 0, 3, 2, 0, 0,
3, 1, 1), V2QE38D = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA,
10L), class = "data.frame")
sapply(data, function(x){sum(is.na(x))})
# V2QE38A V2QE38B V2QE38C V2QE38D
# 0 0 0 0
解釋:
sapply對 a 應用函式list。data.frame是一個串列,每個向量都是這個串列的一個專案。該s中sapply是簡化,所以sapply會盡量輸出串列轉換(從lapply)的載體。如果所需的輸出是一個串列(它有一些優點),請lapply改用。
is.na回傳一個布爾TRUE/FALSE向量。這可以轉換為帶有1/0值的數字向量。
sum將TRUE/FALSE向量轉換為1/0向量并對值求和。
替代解決方案:
或者,不是將data.frame視為串列,而是將其視為矩陣。然后高度優化rowSums,colSums可以發揮作用。
colSums(is.na(data))
# V2QE38A V2QE38B V2QE38C V2QE38D
# 0 0 0 0
rowSums(is.na(data))
# 1 2 3 4 5 6 7 8 9 10
# 0 0 0 0 0 0 0 0 0 0
如果您有 amatrix并且想找到NAs 的位置,這很好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327573.html
標籤:r
下一篇:gsub提取字串
