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

标签 r function dataframe subset

我正在尝试实现以下目标:我有一个数据集和一个函数,该函数对该数据集进行子集化,然后对该子集执行一系列操作。子集基于行名称发生。我能够逐步完成(即分别为每个子集运行此函数),但我有一个所需子集的列表,我想遍历此列表。听起来很复杂 - 请查看下面的示例。
这是我能做的:

#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

我想以某种方式生成 merge_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(element) 不起作用。我尝试阅读有关非标准评估和 eval()、substitute() 的内容,但它对我来说太抽象了 - 我想我还没有达到我的 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 demo (包括OP的原始及以上解决方案)

关于r - 将变量名称列表作为参数传递给 R 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57891868/

相关文章:

r - 使用 R 中的栅格取消大型 ArcGIS 网格文件

r - Quantmod getDividends 的解决方法显然已于 2020 年 1 月 16 日停止工作

python - 基于其他列创建新列作为另一个数据帧的索引

python - 两个数据帧之间的逐元素乘法

r - ggplot2:将多变量facet_wrap标签放在一行上

r - 迭代/循环列表

c - 使用 C 函数对两个矩阵求和会出现逻辑错误

c++ - 函数和数组

mysql - 在 MySQL 的 SELECT 命令中分配不起作用

python pandas dataframe 乘以匹配索引或行名称的列