我编写了一个自定义函数
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()
如果您使用
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