在R中:对名称在列表

时间:2016-05-20 15:28:23

标签: r environment-variables ls

我的全球环境包含多个数据帧。我想只对那些名字中包含特定字符串的函数执行函数。因此,我首先创建一个感兴趣的数据框列表:

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> )
   }

2 个答案:

答案 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)以获取有趣的数据框。