年を含む列(ファイル名に含まれる)を各列に追加したいとします。私はこれを数時間過ごしてきましたが、動作させることはできません。私は簡単なエラーをしていますか?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つの列を互いに引き離すことができます。
あなたは 'dat'の部分をループしていますので、' dat'全体ではなく部分を返す必要があります – rawr
最後の例も有効です。 'my.list'を実行した後、' colnames'が変更されました。 – thelatemail
わかりやすいです。最後の例では、vs my.listという間違ったファイルを見ています。私はそれに応じてそれを編集します。 – Mox