簡體   English   中英

如何使用 dplyr::c_across() 匯總不同類型的變量

[英]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 ℹ 輸入NAssum(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

一個更快的選擇是不使用rowwisec_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.

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