如何获取缺失代码的按列汇总统计?

问题描述 投票:0回答:1

我编写了一个自定义函数

ord_table()
来从一系列数据库中提取汇总统计数据。为了获得这些汇总统计数据,我必须过滤掉缺失的数据代码(所有代码都是大负数)。

> data
     var1 var2   var3   var4
1       3    2      2      1
2  -99999    3      1      1
3       3    5 -99999      2
4       2    3      3      3
5       2    3      4      4
6  -99999    1 -99999      5
7       3    4      1      5
8       5    1      3      3
9       4    1      5 -99999
10 -99999    5      4      1
11 -99999    3      2      2
12      1    2      5      5

列名称位于向量中

ord_vars

我正在使用

lapply
应用该功能。

ordinal <- lapply(ord_vars, ord_table)

这是我的功能:

ord_table <- function(x) {
  table_ord <- data.frame(Median=double(length=1), 
                          Minimum=double(length=1), 
                          Maximum=double(length=1), 
                          IQR=double(length=1))
  table_ord$Median <- data %>% subset(x > 0) %>% pull(x) %>% median()
  table_ord$Minimum <- data %>% subset(x > 0) %>% pull(x) %>% min()
  table_ord$Maximum <- data %>% subset(x > 0) %>% pull(x) %>% max()
  table_ord$IQR <- data %>% subset(x > 0) %>% pull(x) %>% IQR() 
  return(table_ord)
}

除了子集化以删除编码缺失数据的负值之外,一切都在工作。

我尝试过

filter()
subset()
,并且都使用
unquote(x)
而不是
x

对于每个数据帧,我得到的结果包括丢失的数据代码:

[[1]]
  Median Minimum Maximum      IQR
1      2  -99999       5 100002.2

我想去的地方:

[[1]]
  Median Minimum Maximum  IQR
1    2.5       2       5 2.25

数据

set.seed(123)  ## for sake of reproducibility
a <- c(1, 2, 3, 4, 5, -99999)
var1 <- sample(a, 12, replace=TRUE)
var2 <- sample(a, 12, replace=TRUE)
var3 <- sample(a, 12, replace=TRUE)
var4 <- sample(a, 12, replace=TRUE)
data <- cbind(var1, var2, var3, var4) %>% as.data.frame()

ord_vars <- data %>% colnames() %>% as.vector() 
r function filter subset
1个回答
0
投票

如果您使用

filter
,您可以从字符串创建一个符号,然后用
{{
化解,所以:

ord_table <- function (x) {
  table_ord <- data.frame(Median = double(length = 1),
                          Minimum = double(length = 1),
                          Maximum = double(length = 1),
                          IQR = double(length = 1)
  )
  x <- sym(x)
  table_ord$Median <- data %>% filter({{x}} > 0) %>% pull(x) %>% median()
  table_ord$Minimum <- data %>% filter({{x}} > 0) %>% pull(x) %>% min()
  table_ord$Maximum <- data %>% filter({{x}} > 0) %>% pull(x) %>% max()
  table_ord$IQR <- data %>% filter({{x}} > 0) %>% pull(x) %>% IQR() 
  return(table_ord) 
}

但我可能会做这样的事情,并实际将值设置为

NA
(理想情况下,当你读入数据时你会这样做):

library(tidyverse)
data |> 
  mutate(across(test_vars, \(v) na_if(v, -99999))) |> 
  pivot_longer(cols = test_vars) |> 
  drop_na() |> 
  summarise(
    mean = mean(value), min = min(value), max = max(value), IQR = IQR(value),
    .by = name
  )
# A tibble: 4 × 5
  name   mean   min   max   IQR
  <chr> <dbl> <dbl> <dbl> <dbl>
1 var3   3.2      1     5   2  
2 var4   2.58     1     5   1.5
3 var2   2.44     1     5   2  
4 var1   3.33     1     5   1
© www.soinside.com 2019 - 2024. All rights reserved.