繁体   English   中英

将变量名称列表作为参数传递给R函数

[英]pass a list of variable names as an argument to an R function

我正在尝试实现以下内容:我有一个数据集,以及一个子集此数据集然后对子集执行一系列操作的函数。 子集基于行名称进行。 我能够一步一步地(即分别为每个子集运行此函数),但我有一个所需子集的列表,我想循环这个列表。 听起来很复杂 - 请查看以下示例。 这就是我能做的:

#dataframe with rownames
whole_dataset <- data.frame(wt1 = c(1, 2, 3, 6, 6), 
                            wt2 = c(2, 3, 4, 4, 2))
row.names(whole_dataset) = c("HTA1", "HTA2", "HTB2", "CSE1", "CSE2")

# two different non-overlapping subsets
his <- c("HTA1", "HTA2", "HTB2")
cse <- c("CSE1", "CSE2")

#this is the function I have
fav_complex <- function (data, complex) {
  small_data<- data[complex,] #subset only the rows that you need 
  sum.all<-colSums(small_data) #calculate sum of columns
  return(sum.all)
}

#I generate two deparate named vectors
his_data <- fav_complex(data = whole_dataset, complex = his)
cse_data <- fav_complex(data = whole_dataset, complex = cse)

#and merge them
merged_data<- rbind(his_data,cse_data)

它看起来像这样

> merged_data
         wt1 wt2
his_data   6   9
cse_data  12   6

我想以某种方式生成merged_data数据帧,而不必多次调用'fav_complex'函数。 在现实生活中,我有大约20个子集,这是很多代码。 这是我的解决方案,不起作用

#I first have a character vector listing all the variable names
subset_list <- c("his", "cse")

#then create a loop that goes over this list

#make an empty dataframe
merged_data2 <- data.frame()

#fill it with a for loop output
for (element in subset_list) {
  result <- fav_complex(data = whole_dataset, element)
  merged_data2 <-rbind(merged_data2, result)
}

我知道这是错的。 在这个循环中,'element'只是一个字符串,而不是带有东西的变量。 但我不知道如何使它成为变量。 noquote(元素)不起作用。 我尝试阅读非标准评估和eval(),替换(),但它对我来说太抽象 - 我想我还没有我的R专业知识。

考虑by在所有子集运行所需的操作。 但首先要创建一个列:

# ANY FUNCTION TO APPLY ON SUBSETS (REMOVE GROUP COL)
fav_complex_new <- function (sub) {  
  sum.all <- colSums(transform(sub, group=NULL)) 
  return(sum.all)
}

# ASSIGN GROUPING
whole_dataset$group <- ifelse(row.names(whole_dataset) %in% his, "his",
                              ifelse(row.names(whole_dataset) %in% cse, "cse", NA))

# BY CALL
df_list <- by(whole_dataset, whole_dataset$group, FUN=fav_complex_new)
# COMBINE ALL DFs IN LIST
merged_data <- do.call(rbind, df_list)

Rextester演示 (包括OP的原始及以上解决方案)

根据@Gregor关于修改工作流程的建议,你会考虑这个解决方案,包括一些奖金数据争论吗?

  1. 将当前在行名称中的数据放在其自己的列中。
  2. 添加复杂的列。 如果数据很大,我们可以以编程方式执行此操作。
  3. 使用dplyr创建按复杂分组的数据的拆分 - 应用 - 组合摘要。

它可以像这样工作

library(dplyr)

whole_dataset <- tibble(wt1 = c(1, 2, 3, 6, 6),
                        wt2 = c(2, 3, 4, 4, 2),
                        id = factor(c("HTA1", "HTA2", "HTB2", "CSE1", "CSE2")))

whole_dataset <- mutate(whole_dataset,
                        complex = case_when(
                          grepl("^HT", id) ~ "his",
                          grepl("^CSE", id) ~ "cse")
                        ) %>%
  group_by(factor(complex))

whole_dataset %>% summarize(sum_wt1 = sum(wt1),
                            sum_wt2 = sum(wt2))

# # A tibble: 2 x 3
# `factor(complex)` sum_wt1 sum_wt2
# <fct>               <dbl>   <dbl>
# 1 cse                    12       6
# 2 his                     6       9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM