0

Windows10でR(V3.2.2)を実行しているRStudio(V 0.99.467)で作業しています。rgdalを使用してループでRに読み込み、クラス「SpatialPolygonsDataFrame」のオブジェクトを作成する、ArcGISからのベクターマップのコレクションがあります。

同じループで実行したいデータ QAQC チェックと修正がいくつかあります。たとえば、データ フレームのエントリからスペースを削除したいと考えています。これはループ外で簡単に実行できますが、ループ内での参照と名前の割り当てに苦労しています。ループの外では、このコマンドはデータ内のすべてのスペースを削除します。

# the function I want to apply to each map immediately after I read it
as.data.frame(apply(get(mymap)@data[],2,function(x)gsub('\\s+', '',x)))  

この関数はループ内でも機能しますが、スペースのない新しいデータを再割り当てして元のデータを置き換えることはできません。これは、私が何をしようとしているのか、どこで行き詰まっているのかを示すサンプルコードです。

# vector of names from map objects
farmnames <- c("Gardner","Mistletoe","Omni","Sturgill")  
library(rgdal)  
# create vector of filenames based on farmnames
filenames <- paste0(farmnames[],"_Farm_Fields_FINAL")  
# loop to read maps and correct data
for (i in 1:length(farmnames)){  
    name <- farmnames[i]  
    assign(name, readOGR(".", filenames[i])) # create map object  
    get(name)@data[]<- as.data.frame(apply(get(name)@data[],2,function(x)gsub('\\s+', '',x))) # remove spaces from map dataframe
}  

しかし、この最後の行は次のエラーを返します。割り当ての左側に関数を配置できないと思いますか?「get(name)@data[]」と入力すると、R はエラーなしで正しい答えを返すからです。

また、一時データフレームを作成し、一時データフレームを変更し、割り当て関数を使用してマップオブジェクト内のデータフレームを置き換えるさまざまな方法も試しました。ただし、繰り返しますが、これはループ外 (assign(mymap@data[],d)) で機能し、ループ内 (assign(get(name)@data[],d)) では機能しません。

# method 2
d <- as.data.frame(apply(d,2,function(x)gsub('\\s+', '',x)))  
assign(get(name)@data[],d)  

しかし、このメソッドは次のエラーを返します。おそらく、割り当ての最初の引数は、データフレームではなく、単一の要素 (変数名) であると想定されているためでしょうか?

また、変数名を反復処理して列ごとに修正するサブループも作成しましたが、メイン ループ内の 1 行ですべての修正を実行できる場合、これは非常に非効率的です。上に貼り付けた2つの例のいずれかを使用するための解決策を誰かが持っていることを願っています。

StackOverflow 内のクラス SpatialPolygonsDataFrame のオブジェクトの生データの例を添付する方法がわかりません。ここに十分な情報がない場合は、GitHub にパブリック フォルダーを作成してリンクを提供できますか? しかし、私はまだRとプログラミングに慣れていないので、これはかなり基本的な割り当ての問題だと思います.

4

2 に答える 2

0

jhoward による解決策は機能する可能性がありますが、'assign' (および get) を使用することは一般的に適切な方法ではありません。リストを使用する方がはるかに明確で簡単です。ただし、ループ後にこれらのオブジェクトで何をしたいかを指定していないため、確認するのは困難です。私はするだろう:

farmnames <- c("Gardner", "Mistletoe", "Omni", "Sturgill")  
x <- list()
for (i in 1:length(farmnames)){ 
  temp <- readOGR(".", paste0(farmname[i], "_Farm_Fields_FINAL") )
  temp@data <- as.data.frame(lapply(temp@data,function(x)gsub('\\s+', '',x)))
  x[i] <- temp
}

または、ラスター パッケージのトリム関数を使用してよりクリーンなコードを取得することもできます (「ベクター マップ」と呼ばれるものは実際にはシェープファイルであると想定しています)。

library(raster)
farmnames <- c("Gardner", "Mistletoe", "Omni", "Sturgill")  
x <- list()
for (i in 1:length(farmnames)){ 
    filename <- paste0(farmname[i], "_Farm_Fields_FINAL.shp")
    temp <- shapefile(filename)
    temp@data <- trim(temp@data)
    x[i] <- temp
}
于 2015-10-02T05:17:55.620 に答える