2017-01-17 8 views
2

年を含む列(ファイル名に含まれる)を各列に追加したいとします。私はこれを数時間過ごしてきましたが、動作させることはできません。私は簡単なエラーをしていますか?Rを使用してlapplyを使用して複数のデータフレームに列を追加する

概念的には、ファイルのリストを作成してから、lapplyを使用してリスト内の各ファイルの列を計算しています。

私はCensusのデータを使用していますOnTheMap.フレッシュダウンロード。すべてのファイルは、このように命名されている:「points_2013」「points_2014」など、次のコードを使用してデータを読み込む:

library(maptools) 
library(sp) 
shps <- dir(getwd(), "*.shp") 
for (shp in shps) assign(shp, readShapePoints(shp)) 
# the assign function will take the string representing shp 
# and turn it into a variable which holds the spatial points data 

私の質問は、私はファイル名のリストを持っていないことを除いて、this oneに非常によく似ています - ちょうど列の項目をファイル名から抽出したい。 This threadに質問はありますが、答えはありません。 This person [$の代わりに[[運がない]を使用しようとしました。 Thisは、間違いを意味するように見えるかもしれません。私はCSVに出力しようとしていないので、thisは完全に関連していません。

Thisは、私がやろうとしていることです。その例のコードを自分の目的に合わせると、次のようになります。

dat <- ls(pattern="points_") 
dat 
ldf = lapply(dat, function(x) { 
    # Add a column with the year 
    dat$Year = substr(x,8,11) 
    return(dat) 
}) 
ldf 
points_2014.shp$Year 

最後の行はまだNULLを返します!

this threadから、私はそれらの溶液を適合させた。 do.callとrbindを除いて、これはうまくいくようです:

lapply(points, 
    function(x) { 
    dat=get(x) 
    dat$year = sub('.*_(.*)$','\\1',x) 
    return(dat) 
    }) 
points_2014.shp$year 

最後の行はnullを返します。

私のRに何らかの問題があるかどうか疑問に思っています。私はthis exampleを使ってそれをテストしました。それはうまく動作しますので、問題は他の場所です。

# a dataframe 
a <- data.frame(x = 1:3, y = 4:6) 
a 
# make a list of several dataframes, then apply function 
#(change column names, e.g.): 
my.list <- list(a, a) 
my.list <- lapply(my.list, function(x) { 
    names(x) <- c("a", "b") 
    return(x)}) 
my.list 

このサイトからいくつかの助けた後、私の最終的なコードをした

#-------takes all the points files, adds the year, and then binds them together 
points2<-do.call(rbind,lapply(ls(pattern='points_*'), 
           function(x) { 
           dat=get(x) 
           dat$year = substr(x,8,11) 
           dat 
           })) 
points2$year 
names(points2) 

それは、しかし、短期的には便利ですrbindを、使用しません。長期的には、もう一度分割してcbindを使用する必要があるので、2つの列を互いに引き離すことができます。

+2

あなたは 'dat'の部分をループしていますので、' dat'全体ではなく部分を返す必要があります – rawr

+0

最後の例も有効です。 'my.list'を実行した後、' colnames'が変更されました。 – thelatemail

+0

わかりやすいです。最後の例では、vs my.listという間違ったファイルを見ています。私はそれに応じてそれを編集します。 – Mox

答えて

1

私は、次のコードを使用します。

for (i in names.of.objects){ 
    temp <- get(i) 
    # do transformations on temp 
    assign(i, temp) 
} 

これは動作しますが、それは価値の方法でコールに二回、全データの割り当てを行うことから、間違いなくパフォーマンスではありません。

+0

私は 'for'は 'Rの方法ではない'と言われています。確かに動作しますが、適用コードのビットは、より少ない行で、よりクリーンなように見えます。 – Mox

関連する問題