2017-11-04 22 views
2

私のデータフレームには文字列があります。私は自分自身で作成した関数を使って、既存の文字列から新しい列を作成したいと思います。適用ファミリを使用して新しい列を作成

My機能

lat_finder <- function(coord){ 
return(as.numeric(substr(strsplit(coord,",")[[1]][1],2,10)))} 

テストデータフレーム私はこの

test['Lat'] <- lapply(test['loc'],lat_finder) 

結果をしようとしている

test <- data.frame('loc' = c("(37.7862913318072, -122.401375181471)","(37.7646938184545, -122.449439257453)","(37.7860078381928, -122.430650176965)")) 

は新しい列ですが、関数の結果だけで最初の行、つまり最初のlatは37.786 ...となります。これは新しい列のすべての行の値です。私は前にこの操作をしたようにforループが動作することを知っていますが、かなり時間がかかりますので、これを高速化したいと思っています。私はここに何かが欠けていることは明らかだと思うので、修正に加えて、自分のコードが何をしているのかについての説明に感謝する。

+0

です。注:元の投稿では、私が間違って作業していたデータフレーム全体を参照しました。それはlapply(test ['loc'] ....)になっていて、修正されているはずです。 – maxo

答えて

0

初期ノート - data.frameへの通話はstringsAsFactorsが欠落しているので、= FALSE、あなたがそれを述べるような問題が再現可能ではない可能要因として、あなたの入力文字列を変換しています。それは私がそれはちょうど私がそれを追加し、そこから行くよ、あなたのテストコードに問題はなく、あなたの実際の問題の根本かもしれないと思うと述べた。

test_f <- data.frame('loc' = c("(37.7862913318072, -122.401375181471)", 
          "(37.7646938184545, -122.449439257453)", 
          "(37.7860078381928, -122.430650176965)"), 
       stringsAsFactors = FALSE) 

ということで、あなたの根本的な問題は方法ですあなたは列 'loc'を引っ張っています。

> dollar_pull <- test_f$loc 
> dollar_pull 
[1] "(37.7862913318072, -122.401375181471)" "(37.7646938184545, -122.449439257453)" 
[3] "(37.7860078381928, -122.430650176965)" 
> typeof(dollar_pull) 
[1] "character" 
> class(dollar_pull) 
[1] "character" 

関数呼び出しの作品:

lapply

> your_pull <- test_f['loc'] 
> your_pull 
            loc 
1 (37.7862913318072, -122.401375181471) 
2 (37.7646938184545, -122.449439257453) 
3 (37.7860078381928, -122.430650176965) 
> typeof(your_pull) 
[1] "list" 
> class(your_pull) 
[1] "data.frame" 
あなたは、古典的な $表記で取得することができ、入力としてベクトルを、期待している:これは、角括弧、stringnameの選択は、1列のデータフレームを引きます今すぐ(ベクターが必要な場合はリストを入手してください)、

> lapply(test_f$loc,lat_finder) 
[[1]] 
[1] 37.78629 

[[2]] 
[1] 37.76469 

[[3]] 
[1] 37.78601 

イヌータのカップルls:

1)おそらく、新しい列に$を割り当てることをお勧めします。

2)新しいdata.frame列のリストではなくベクトルを生成するsapplyまたはvapplyを使用することができます。

3)Hadley Wickhamのpurrパッケージの適用ファミリを放棄することができます。参考までにここでの呼び出しはpurrr::map_chr(test_f$loc, you_function)

+0

機能的な支援だけでなく、徹底的な説明をいただき、ありがとうございます。 – maxo

1

希望の結果が何であるかは完全にはわかりませんが、これは近いですか?

test <- data.frame(loc = c("(37.7862913318072, -122.401375181471)", 
          "(37.7646938184545, -122.449439257453)", 
          "(37.7860078381928, -122.430650176965)")) 
test$loc <- gsub("[\\(\\)]", "", test$loc) 
lonlat <- do.call(rbind, strsplit(test$loc,",")) 
lonlat <- matrix(as.numeric(lonlat), nrow(lonlat)) 
lonlat 

#   [,1]  [,2] 
# [1,] 37.78629 -122.4014 
# [2,] 37.76469 -122.4494 
# [3,] 37.78601 -122.4307 
+2

おそらく 'as.numeric'をどこかに追加するべきです。なぜなら、あなたは各' X2'の先頭に「スペース」を隠しているからです。 (そしてそれらの '要因')。 – r2evans

+0

本当に巧妙な解決策。私はまた、適用する家族の説明を探していたので、私は答えをalex.h与える必要がありましたが、私は間違いなくこのトリックの心を保つでしょう。 – maxo

関連する問題