查找工作空间中所有数据框中所有列的名称

时间:2011-03-28 03:31:49

标签: list r variables names

假设我在R的工作空间中有多个数据帧,并且我想要所有数据帧中列的名称列表。

我认为以下内容可行。但事实并非如此。在自己的工作区中尝试一下。

sapply(ls(),names) 

为什么不起作用? ls()创建所有数据帧的列表,然后应将名称函数应用于每个数据帧。这是我现在的简单问题。

接下来:我想确定名称中包含字母“date”的所有列,以便我可以将以下函数应用于每个列,无论它们位于何处。

as.Date(dataframe$dateofenrollment,origin="1899-12-30")

4 个答案:

答案 0 :(得分:5)

它不起作用,因为ls()返回工作空间中对象的名称,而不是对象本身。

您可能需要以下内容:

lapply(ls(), function(x) if(is.data.frame(o <- get(x))) names(o))

对于任何非数据框的对象,这将包含NULL元素,但可能您可以解决这个问题。

答案 1 :(得分:2)

问题的第一部分可以通过allNames <- lapply(ls(), function(x) names(get(x)))来回答。使用其中一个正则表达式函数来确定感兴趣的列也应该非常简单,例如lapply(allNames, function(x) grepl("date", x))。关于如何获取前两位并更新列,我已经没有用了,但也许这会让你和其他人走上正确的道路。

答案 2 :(得分:1)

这是另一个解决方案,其中有一个简单的例子来实现您的两个目标。您可以很容易地修改它以适合您的情况。如果您有疑问,请告诉我。

# create a set of dummy data frames
df1 = data.frame(x = rnorm(100), y = rnorm(100))
df2 = data.frame(x = rnorm(100), z = rnorm(100))
ch1 = c('a', 'b', 'c')


# get all objects
all.obj = sapply(ls(), get)

# get data frames
dfrs = all.obj[sapply(all.obj, is.data.frame)]

# get data frames containing 'x' as column name
dfrs2 = dfrs[lapply(dfrs, function(df) {'x' %in% names(df)}) == 'TRUE']

# replace x with square of x in all these data frames
dfrs3 = lapply(dfrs2, function(df) {df$x = df$x^2; df})

答案 3 :(得分:0)

f <- function(){
lo <- ls(envir=.GlobalEnv)
lo <- lo[sapply(lo,function(x) eval(substitute(class(X)=="data.frame",
                                                   list(X=as.name(x))))
                   )]
if(length(lo)>0){
    res <- lapply(lo,function(x) eval(substitute(names(X),list(X=as.name(x)))))
    names(res) <- lo
} else res <- NULL
return(res)
}

修改

ls.names <- function(){
  res <- lapply(mapply(as.name,ls(pos=1)),
                function(x) if(class(xe<-eval(x))=="data.frame") names(xe))
  res <- res[!unlist(lapply(res,is.null))]
  return(res)
}

EDIT2

eapply(env=.GlobalEnv,function(x) if(is.data.frame(x)) names(x))