2016-08-02 5 views
2

間動作中:パフォーマンスの問題2列のデータフレームが与えられるデータフレームの二つの列

  • 長さ(要素の長さ)
  • findLengthOf(これは、値の文字列である)ための要素のインデックス長さが必要です

したがって、2番目の列のすべてのインデックスの長さをすべて見つけて、結果を3番目の列に配置する必要があります。 私たちは1637年のな長さを検索し、1835年を得る場合には、上記の例を参照してください:

> df$length[1637] 
[1] 1835 


head(df) 
    length findLengthOf 
1 6434 1637,386.... 
2 4272 4322,414.... 
3 7338 2052,639.... 
4 4932 190,1567.... 
5 2397 8963,844.... 
6 4405 103,4346.... 

    head(df) 
    length findLengthOf   result 
1 6434 1637,386.... 1835, 2404, 4689 
2 4272 4322,414.... 1184, 2721, 7215 
3 7338 2052,639.... 5253, 2998, 6153 
4 4932 190,1567.... 2931, 6496, 7784 
5 2397 8963,844.... 3796, 3488, 6555 
6 4405 103,4346.... 1662, 5481, 1244 

set.seed(123) 
df <- data.frame(length = sample(1e4), 
       findLengthOf = I(replicate(1e4, paste(sample(1:10000,1),sample(1:10000,1),sample(1:10000,1),sep=","), simplify = FALSE))) 

df$result=lapply(lapply(df$findLengthOf,strsplit,split=","), function(x){df[x[[1]],"length"]}) 

コードは動作しますが、それは長い間になります。どうすればスピードを上げることができますか? はまた、なぜ

head(lapply(df$findLengthOf,strsplit,split=",")) 

はいつもとリストのこの奇妙なリストを返すん:

[[1]] 
[[1]][[1]] 
[1] "7744" "1346" "4626" 

これらの二重括弧を回避する方法はありますか? 何か応答がありがとうございます!デビッド(セット固定= T)から

提案:

> ptm <- proc.time() 
> df$result=lapply(lapply(df$findLengthOf,strsplit,split=",",fixed=T), function(x){df[x[[1]],"length"]}) 
> proc.time() - ptm 
    user system elapsed 
17.220 0.000 17.147 
> ptm <- proc.time() 
> df$result=lapply(lapply(df$findLengthOf,strsplit,split=","), function(x){df[x[[1]],"length"]}) 
> proc.time() - ptm 
    user system elapsed 
17.260 0.000 17.142 
+0

「1637年の長さと1835年の得点」は不明ですか? – zx8754

+0

こんにちはzx8754、大丈夫です。つまり、1835年にdf $ length [1637]という結果になりました。 –

+1

単に 'fixed = TRUE'を' strsplit'呼び出しに追加することで、〜X10回速く走らせることができます。また、 'strsplit'と' lapply'の両方がリストを返します。リストのリストです。私はまた、この質問が以前のものとどのように関連しているのだろうと思っています。最初の場所などで文字列に連結しないなど、パフォーマンスの比較や代替提案を無視したときです。 –

答えて

1

ここで完全にvectotorizedソリューションが、おそらくメモリ高価です。私はパフォーマンスをテストしていません

library(data.table) 
res <- matrix(df$length[unlist(setDT(df)[, 
       tstrsplit(findLengthOf, ",", fixed = TRUE, type.convert = TRUE)])], 
       nrow = nrow(df)) 
df$result <- as.list(as.data.frame(t(res))) 
+0

私は努力を感謝し、後でパフォーマンスをテストして、ここドイツの昼食時間にします。後で結果を投稿します。 –

+0

すごい!それはかかります:ユーザシステムが経過しました 0.04 0.00 0.04私のコードを検証することについてもっと知ることはできますか?良いチュートリアルはありますか? –

+1

Rのベクトル化コードは考え方です。それには経験があります。私はいくつかのイントロ[ここ](http://stackoverflow.com/documentation/r/3327/r-code-vectorization-best-practices#t=201608021213337797116)を提供しようとしました。これはまた、良い紹介http://www.noamross.net/blog/2014/4/16/vectorization-in-r--why.htmlです。 –

関連する問題