我试图实现以下功能:我有一个数据集和一个函数,该函数对数据集进行子集抽取,然后在子集上执行一系列操作。抽取基于行名称完成。我能够逐步完成它(即为每个子集分别运行此函数),但我有一个所需子集的列表,并且我想循环遍历此列表。请参考下面的示例。
我希望能够以某种方式生成merged_data数据框,而不必多次调用“fav_complex”函数。在实际工作中,我有大约20个子集,这需要大量的代码。这是我的解决方案,但并不起作用。
#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(element)没有起作用。我尝试阅读有关非标准评估和eval(),substitute()的内容,但对我来说太抽象了 - 我认为我还没有达到我的R专业水平。
data
而不是whole_dataset
。2)在循环中使用result <- fav_complex(data = whole_dataset, get(element))
。 - Rui Barradassplit
,lapply
,do.call(rbind)
,或者如果您不介意额外的依赖项,则使用purrr
或类似工具。 (或者更简单地说,“dplyr”/“data.table”分组操作,如果操作确实像“对所有列求和”那样简单) - Gregor Thomasmerged_data
不同,因为它缺少colnames
和rownames
。您有什么建议如何引入它们吗?如果您能告诉我为什么您认为使用get
不是一个好主意,我也会非常感激。 @RuiBarradas,谢谢,我已经纠正了错误。这个解决方案也会产生一个没有行名和列名的数据框。 @Gregor,这只是一个非常简化的例子,我发现这种奇怪的方式更方便,但如果必要的话,我可能会尝试重新编写它! - Wera