簡體   English   中英

R 嵌套函數

[英]R nested functions

我必須計算數據集中每個觀察值的缺失值數量。 由於跨多個時間段有多個變量,我認為最好嘗試一個函數來保持語法清晰。 查找缺失值數量的第一部分工作正常:

data$NMISS <- data %>% 
  select('x1':'x4') %>%  
  apply(1, function(x) sum(is.na(x)))

但是,當我嘗試將其轉換為函數時,我得到“select() 錯誤:!NA/NaN 參數”

library(dplyr)
library(tidyverse)

data <- data.frame(x1 = c(NA, 1, 5, 1),   
                   x2 = c(7, 1, 1, 5),
                   x3 = c(9, NA, 4, 9),
                   x4 = c(3, 4, 1, 2))

NMISSfunc <- function (dataFrame,variables) {
  
  dataFrame %>% select(variables) %>% 
    apply(1, function(x) sum(is.na(x)))
  
}

data$NMISS2 <- NMISSfunc(data,'x1':'x4')

我認為它不喜歡范圍內的:因為它將接受c('x1','x2','x3','x4')而不是'x1':'x4'

有些范圍超過二十列,因此列出它們並不能真正提供保持語法整潔的解決方案。

有什么建議么?

你是對的,你不能使用"x4":"x4" ,因為在這種情況下這不是:運算符的有效使用。 為了使它以 tidyverse 風格工作,您的variables變量需要在select中有選擇地取消引號。 幸運的是,tidyverse 有卷曲的符號{{variables}}來處理這種情況:

NMISSfunc <- function (dataFrame, variables) {
  
  dataFrame %>% 
    select({{variables}}) %>% 
    apply(1, function(x) sum(is.na(x)))
}

現在我們可以使用x1:x4 (不帶引號)並且該函數按預期工作:

NMISSfunc(data, x1:x4)
#> [1] 1 1 0 0

創建於 2022-12-13,使用reprex v2.0.2

為什么不簡單地,

data %>% 
 mutate(NMISS = rowSums(is.na(select(., x1:x4))))

  x1 x2 x3 x4 NMISS
1 NA  7  9  3     1
2  1  1 NA  4     1
3  5  1  4  1     0
4  1  5  9  2     0

暫無
暫無

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

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