当数据帧是函数内的输入参数时如何跨多列进行变异

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

我有许多数据框,它们都具有相同的变量和结构。 我想从每个输入数据帧中的各个级别数据出发,并使用函数总结所有行中的输入数据帧,创建新变量。 也就是说,对于每个输入数据帧,我想创建一个输出数据帧,其中一行总结了每个指定年龄组的

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) 我应该如何实现为每个输入数据帧和各个年龄组创建新的汇总变量,其中每个输入数据帧/年龄组组合都需要汇总变量。

r dataframe function parameter-passing across
1个回答
0
投票

在基地,你可以从

开始
# 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 
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.