Поиск имен всех столбцов во всех информационных фреймах в рабочей области - PullRequest
2 голосов
/ 28 марта 2011

Предположим, что у меня есть несколько фреймов данных в рабочей области в R, и мне нужен список имен столбцов во всех фреймах данных.

Я думал, что будет работать следующееНо это не так.Попробуйте это в вашем собственном рабочем пространстве.

sapply(ls(),names) 

Почему это не работает?ls () создает список всех фреймов данных, а затем функция имен должна применяться к каждому фрейму данных.Это мой простой вопрос на данный момент.

Далее: я хочу определить все столбцы, в имени которых есть буквы «дата», чтобы я мог применить следующую функцию к каждому из этих столбцов.независимо от того, в каком кадре они находятся.

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

Ответы [ 4 ]

5 голосов
/ 28 марта 2011

Это не работает, потому что ls() возвращает имена объектов в нашем рабочем пространстве, а не сами объекты.

Вы, вероятно, хотите что-то вроде следующего:

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

Это будет иметь NULL элементов для любых объектов, которые не являются фреймами данных, но, вероятно, вы можете обойти это.

2 голосов
/ 28 марта 2011

На первую часть вашего вопроса можно ответить allNames <- lapply(ls(), function(x) names(get(x))).Использование одной из функций регулярных выражений для определения интересующих столбцов также должно быть довольно простым, например, lapply(allNames, function(x) grepl("date", x)).Я уже не в курсе, как взять эти первые два бита и обновить столбцы, но, возможно, это приведет вас и других к правильному пути.

1 голос
/ 28 марта 2011

Вот еще одно решение с простым примером для достижения обеих ваших целей. Вы можете изменить его довольно легко в соответствии с вашей ситуацией. Дайте мне знать, если у вас есть вопросы.

# 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})
0 голосов
/ 28 марта 2011
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))
...