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)))。正規表現関数の 1 つを使用して対象の列を決定することも、 のようなもので非常に簡単ですlapply(allNames, function(x) grepl("date", x))。これらの最初の 2 つのビットを取得して列を更新する方法については、気力が尽きていますが、これにより、あなたや他の人が正しい道をたどることができるかもしれません。

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

EDIT2

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