我的全球环境包含多个数据帧。我想只对那些名字中包含特定字符串的函数执行函数。因此,我首先创建一个感兴趣的数据框列表:
dfs <- ls()[sapply(ls(), function(x) class(get(x))) == 'data.frame']
dfs <- as.data.frame(dfs)
dfs_lst <- agrep("stats", dfs$dfs, ignore.case=FALSE, value=TRUE,
max.distance=0.1, useBytes=FALSE)
dfs_lst正确返回包含字符串“stats”的全局环境中的所有数据帧。 dfs_lst
chr [1:3] "stats1" "stats2" "stats3".
现在,我想在这3个数据帧上执行函数,但是我不知道如何从dfs_lst中调用它们。我想要这样的东西:
for(i in 1:length(dfs_lst){
# Find dataframe name in dfs_lst, and then use the matching dataframe in
# global environment. So, something of the sort:
for(dfs_lst[i] in ls()){
result[i,] <- dfs_lst[i] %>%
summarise(. , <summarise stuff> )
}
}
例如,对于i = 1,dfs_lst [1]是数据帧“stats1”,我想执行以下操作,并将其保存在“结果”的第一行中:
for(stats1 in ls()){
result[1,] <- stats1 %>% summarise(. , <summarise stuff> )
}
答案 0 :(得分:3)
正如@lmo指出的那样,最好将这些data.frame
存储在一个list
中。在您的环境中浮动的data.frame
对象称为“stats1”,“stats2”等,而不是将data.frame
对象存储在list
中的(hacky)方式:
dfs <- ls()[sapply(ls(), function(x) class(get(x))) == 'data.frame']
##make an empty list
my_list <- list()
##populate the list
for (dfm_name in dfs) {
my_list[[dfm_name]] <- get(dfm_name)
}
现在,您已经有了一个列表my_list
,其中包含您环境中类data.frame
的所有对象。如果您想使用所有data.frame
个名称“statsX”:
##find all list objects whose name starts with "stats"
stats_objects <- substr(names(my_list),1,5)=="stats"
results <- matrix(NA, ncol = your_length, nrow = sum(stats_objects))
##now perform intended operations
for ( row_num in 1:nrow(results)) {
results[i,] <- my_list[stats_objects][[row_num]] %>%
summarise(. , <summarise stuff> )
}
在代码中进行一些修改后(例如your_length
需要指定),并且您希望所有名称都包含“stats”的对象,因此您需要使用正则化表达式,这应该在必要时执行
这有什么好处my_list
包含所有data.frames
,因此如果您选择在data.frames
上运行分析而不是“stats”,您仍然可以使用类似的程序访问它们。希望这会有所帮助。
答案 1 :(得分:0)
正如评论中所讨论的,如果我们有一个有趣的数据框列表,那么将元素作为数据框处理会更容易。所以,这里的主要问题似乎只是对象名而不是实际的data.frame对象。
为了遵循代码并跟踪数据类型,我首先对其进行了分解:
1
env.list <- ls() # chr vector
2
env.classes <- sapply(env.list, function(x) class(get(x)))
# list of chr (containing classes), element names: data frame names
3
dfs <- env.list[env.classes == 'data.frame'] # chr vector
4
dfs <- as.data.frame(dfs)
# data frame with one column (named "dfs"), containing data.frame names
现在,我们可以获取data.frames列表:
3
dfs <- env.list[env.classes == 'data.frame'] # chr vector
dfs.list <- sapply(dfs, function(x) {get(x)})
grep
现在可以应用于names(dfs.list)
以获取有趣的数据框。