2

假设我在 R 的工作区中有几个数据框,并且我想要所有数据框中列的名称列表。

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

sapply(ls(),names) 

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

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

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

4 回答 4

5

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

您可能想要以下内容:

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

这将包含NULL任何不是数据框的对象的元素,但大概您可以解决这个问题。

于 2011-03-28T03:53:43.010 回答
2

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

于 2011-03-28T03:52:15.723 回答
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})
于 2011-03-28T04:27:39.360 回答
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)
}

编辑2

eapply(env=.GlobalEnv,function(x) if(is.data.frame(x)) names(x))
于 2011-03-28T08:16:26.473 回答