2017-08-17 2 views
1

Rには新しく、おそらくnoobに関する質問があります。ループのための特定には、次のコードを考えてみましょう:Rデータフレームへのアクセス:ここでは何が起こっていますか?

library(lubridate) 
#Read in all site files in the directory 
sitefiles <- list.files(pattern = "\\.csv$") #Get a list of all csv's in dir 
sites <- list()        #Create an empty list. 
sites <- lapply(sitefiles, read.csv)   
names(sites) <- gsub("\\.csv$", "", sitefiles) #Rename the list 

for (site in names(sites)){ 
    site$time <- dmy_hms(site$timestamp) 
     #Error: $ operator is invalid for atomic vectors 
} 

OK、のではなく、これを試してみましょう:

for (site in sites){ 
    site$time <- mdy_hms(site$timestamp) 
} 

リストsites内のデータフレームに何もしないように表示されます。特に、コマンドcolnames(sites[[1]])はforループを実行する前後で同じです。列が追加されていません。

しかし、変更がありました。 Rstudioには、新しい変数があることがわかります。siteという名前のデータフレームがあります。これには列時間が追加されています。なんで?

ここでは何が起こっていますか?このコマンドを正常に実行するにはどうすればよいですか?

+0

'site'はまだオブジェクトではありません。さらに、 'sites'はリストです。したがって、ループの代わりに 'lapply'する必要があります。 – loki

+0

恋人はどのように見えますか?また、いくつかのドキュメントがありますか?私はループとラップが交換できると思った。 – Dirk

+2

あなたの 'for'ループに' site $ time < - dmy_hms(site $ timestamp) 'の代わりに' sites [[site]] $ time < - dmy_hms(site $ timestamp) 'を使います。 [この投稿](https://stackoverflow.com/questions/36777567/is-there-a-logical-way-to-think-about-list-indexing/36815401#36815401)をチェックしてください。より長い議論。また、ヘルプファイル '?" ["'は2〜3回読む価値があります。 – lmo

答えて

1

ソリューションは、次のようになります。

sites <- lapply(sites, function(x) { 
    x$time <- dmy_hms(x$timestamp) 
    x 
}) 

This summaryは、すべての異なるデータ型のサブセットであなたを助けます。このような場合のために知っている

基礎は以下のとおりです。

  • sitesは、リスト保持複数data.frames
  • lapplyあり、これらすべてのdata.framesを取り、その後
  • 修正これらのリストを同じ関数を適用data.framesが返されます

リトルサイドノート:あなたが後で名前に頼ります...

0

これでソースを見つけることはできませんでしたが、ローカルでテストすると、forループは反復処理中のリストの項目のローカルコピーを作成しているようです。おそらくそれがnamesを反復する理由、またはむしろapplyが推奨されます。それがインデックス変数は、周囲の環境のままであること標準的な動作であるため

> a <- list(mtcars$cyl) 
> b <- list(mtcars$mpg) 
> x <- c(a, b) 
> tracemem(a) 
[1] "<0000000014731C68>" 
> tracemem(b) 
[1] "<00000000147711D8>" 
> for(myList in x) { print(tracemem(myList)) } 
[1] "<000000000C37E650>" 
[1] "<00000000096AED50>" 

site変数が残っています。 lapply

+0

それは実際に意味があります。これを行う正しい方法は何ですか? – Dirk

+1

私は 'lapply'が最も賢い方法だと思います。それ以外は '名前(サイト)'を繰り返し、上記の@lmoのように '[]]'演算子を使ってリストにアクセスします。 – sebastianmm

関連する問題