假设我在R的工作空间中有多个数据帧,并且我想要所有数据帧中列的名称列表。
我认为以下内容可行。但事实并非如此。在自己的工作区中尝试一下。
sapply(ls(),names)
为什么不起作用? ls()创建所有数据帧的列表,然后应将名称函数应用于每个数据帧。这是我现在的简单问题。
接下来:我想确定名称中包含字母“date”的所有列,以便我可以将以下函数应用于每个列,无论它们位于何处。
as.Date(dataframe$dateofenrollment,origin="1899-12-30")
答案 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))