我有许多数据框,它们都具有相同的变量和结构。 我想从每个输入数据帧中的各个级别数据出发,并使用函数总结所有行中的输入数据帧,创建新变量。 也就是说,对于每个输入数据帧,我想创建一个输出数据帧,其中一行总结了每个指定年龄组的
regularVar_names
中命名的变量,并灵活地实现了年龄组。 该函数应该估计变量不为 -NA 的行数
这就是我尝试实现它的方式。
数据:
input.ds.2018 = data.frame(Var1 = c(1,1,NA,NA,1,2),Var2 = rep(c(1,2),3),V3 = c(NA,rep(2,4),1),
y_4 = c(NA,"y","z","l","m","n"),X_AGE80 = c(17,18,NA,84,21,72))
这是我尝试的解决方案,但显然
.
没有像我假设的那样提供输入数据帧。
calc_unwt_n_regularVar_fn = function(df,VAR){
df %>% filter(!is.na(eval(parse(text = VAR)))) %>% nrow
}
# apply calc_unwt_n_regularVar_fn to age-group 18 to 84 for regular variables called Var1 and Var2
regularVar_names = c("Var1","Var2")
output = input.ds.2018 %>%
filter(X_AGE80 <= 84) %>%
filter(X_AGE80 >= 18) %>%
summarize(across(all_of(regularVar_names), ~ calc_unwt_n_regularVar_fn(.,cur_column()),.names = "unwt_denom_{.col}"))
但是它认为
.
等同于 cur_column()
,所以它抛出一个错误:
Error in `summarize()`:
i In argument: `across(...)`.
Caused by error in `across()`:
! Can't compute column `unwt_denom_Var1`.
Caused by error in `UseMethod()`:
! no applicable method for 'filter' applied to an object of class "c('double', 'numeric')"
我还尝试将
.
替换为 .data
来尝试将输入数据帧作为参数传递,但这也不起作用。
所以我的问题是: (1) 如何将数据帧作为参数输入到函数“calc_unwt_n_regularVar_fn”? 或者如果这是一种愚蠢的做法, (2) 我应该如何实现为每个输入数据帧和各个年龄组创建新的汇总变量,其中每个输入数据帧/年龄组组合都需要汇总变量。
在基地,你可以从
开始# set-up
input.ds.2018 = data.frame(Var1 = c(1,1,NA,NA,1,2),
Var2 = rep(c(1,2),3),
V3 = c(NA,rep(2,4),1),
y_4 = c(NA,"y","z","l","m","n"),
X_AGE80 = c(17,18,NA,84,21,72))
l = list(input.ds.2018, input.ds.2018)
# fun
f = \(X, y, lower, upper) {
stopifnot(c(y, "X_AGE80") %in% names(X))
X = subset(X, X_AGE80 %in% lower:upper)
vapply(X[y], \(i) length(i[!is.na(i)]), numeric(1L))
}
# apply function f on list of data frames l
regularVar_names = c("Var1","Var2")
lapply(l, f, y = regularVar_names, lower = 18, upper = 84)
[[1]]
Var1 Var2
3 4
[[2]]
Var1 Var2
3 4