[英]How to summarise across different types of variables with dplyr::c_across()
我有不同類型變量的數據。 一些是字符,一些因素,還有一些數字,如下所示:
df <- data.frame(a = c("tt", "ss", "ss", NA), b=c(2,3,NA,1), c=c(1,2,NA, NA), d=c("tt", "ss", "ss", NA))
我正在嘗試使用c_across
中的dplyr
計算每個觀察值的缺失值數量但是, c_across
似乎無法組合不同類型的值,如下面的錯誤消息所示
df %>%
rowwise() %>%
summarise(NAs = sum(is.na(c_across())))
錯誤:
summarise()
輸入NAs
。 x 不能組合a
<factor> 和b
。 ℹ 輸入NAs
是sum(is.na(c_across()))
。 ℹ 錯誤發生在第 1 行。
事實上,如果我只包含數字變量,它就可以工作。
df %>%
rowwise() %>%
summarise(NAs = sum(is.na(c_across(b:c))))
如果我只包含字符變量,同樣的事情
df %>%
rowwise() %>%
summarise(NAs = sum(is.na(c_across(c(a,d)))))
我可以在不使用c_across
情況下解決這個問題,如下所示,但是我有很多變量,所以它不是很實用。
df %>%
rowwise() %>%
summarise(NAs = is.na(a)+is.na(b)+is.na(c)+is.na(d))
我可以使用傳統的apply
方法,如下所示,但我想使用dplyr
解決這個dplyr
。
apply(df, 1, function(x)sum(is.na(x)))
關於如何按行、有效地和使用dplyr
計算缺失值數量的任何建議?
我會建議這種方法。 這個問題是因為兩件事。 首先,您的數據框中的不同類型的變量,您需要一個用於 rowwise 樣式任務的關鍵變量。 因此,在接下來的代碼中,我們首先將變量轉換為類似的類型,然后根據行數創建一個 id。 有了這個,我們使用該元素作為rowwise()
輸入,然后我們可以使用c_across()
函數。 這里的代碼(我用過你的df
數據):
library(tidyverse)
#Code
df %>%
mutate_at(vars(everything()),funs(as.character(.))) %>%
mutate(id=1:n()) %>%
rowwise(id) %>%
mutate(NAs = sum(is.na(c_across(a:d))))
輸出:
# A tibble: 4 x 6
# Rowwise: id
a b c d id NAs
<chr> <chr> <chr> <chr> <int> <int>
1 tt 2 1 tt 1 0
2 ss 3 2 ss 2 0
3 ss NA NA ss 3 2
4 NA 1 NA NA 4 3
我們可以使用新的mutate_at()
across()
和mutate()
來避免mutate_at()
函數來mutate_at()
變量:
#Code 2
df %>%
mutate(across(a:d,~as.character(.))) %>%
mutate(id=1:n()) %>%
rowwise(id) %>%
mutate(NAs = sum(is.na(c_across(a:d))))
輸出:
# A tibble: 4 x 6
# Rowwise: id
a b c d id NAs
<chr> <chr> <chr> <chr> <int> <int>
1 tt 2 1 tt 1 0
2 ss 3 2 ss 2 0
3 ss NA NA ss 3 2
4 NA 1 NA NA 4 3
一個更快的選擇是不使用rowwise
或c_across
,而是使用rowSums
library(dplyr)
df %>%
mutate(NAs = rowSums(is.na(.)))
# a b c d NAs
#1 tt 2 1 tt 0
#2 ss 3 2 ss 0
#3 ss NA NA ss 2
#4 <NA> 1 NA <NA> 3
如果我們想select
某些列,即numeric
df %>%
mutate(NAs = rowSums(is.na(select(., where(is.numeric)))))
# a b c d NAs
#1 tt 2 1 tt 0
#2 ss 3 2 ss 0
#3 ss NA NA ss 2
#4 <NA> 1 NA <NA> 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.