2017-06-17 6 views
-1

私はRのコードを改善する方法を読んできました。ここで答えのいくつかを見て、R infernoの文書も少し読んでいます。今私はこの問題を抱えており、私が作成したループは永遠に(15時間と数えて)摂取しているようです。このループを改善するアイデアは可能ですか?

k <- NROW(unique(df$EndStation.Id)) 
l <- NROW(unique(df$StartStation.Id)) 
m1 <- as.matrix(df[,c("Duration","StartStation.Id","EndStation.Id")]) 
g <- function(m){ 
    for (i in 1:l){ 
     for (j in 1:k){ 
      duration <- m[(m[,2]==i & m[,3]==j),1] 
      if (NROW(duration)<=1) { 
       m[(m[,2]==i & m[,3]==j),1] <- NA 
       next 
     } 
     duration <- duration/median(duration) 
     m[(m[,2]==i & m[,3]==j),1] <- duration 
     } 
    } 
return(m) 
} 

answer <- g(m1) 

駅(開始と終了)の数は750と期間ベクタサイズの両方で80に1または2から多くのことを変えることができ、このループはありそうですか、私はあきらめなければならないとへのアクセスを取得しようより速いコンピュータ。

敬具、 フェルナンド

+2

ようこそStackOverflow! [良い質問をする方法](https://stackoverflow.com/help/how-to-ask)を読んで、あなたの例を[再現可能]にしてください(http://stackoverflow.com/questions/5963269/how -to-make-a-great-r-reproducible-example)を使用します。 –

+0

ループは750x750回実行されますが、スカラーではないベクトル演算を使用しています。 – Marichyasana

答えて

0

コード読み取りが少し難しいですが、私は、これはあなたが何をしたいかだと思う:

library(data.table) 
## generate a data table 
dt <- setDT(df[,c("Duration","StartStation.Id","EndStation.Id")]) 
## calculate the duration 
dt[, Duration := Duration/median(Duration), by = .(StartStation.Id, EndStation.Id)] 
## replace the result with NA when the vector length == 1 
dt[, N := .N, by = .(StartStation.Id, EndStation.Id)][ 
    N == 1, Duration := NA 
    ][, N := NULL] 
+0

これはとても簡単に見えますが、私は間違いなくdata.tableを詳しく見ていきます。答えをありがとう。 唯一の小さな違いは、ベクトルの長さが1以下の場合はNAで置き換えたいが、それは計算でエラーを避け、後で簡単に削除できるようにすることだった。理想的には、それらを取り除くためにその2番目の部分を編集します –

0

私が正しくあなたの機能を理解していれば、あなたがしたいですその期間の中央値で2つの駅間の所要時間を分割し、NAここ

に設定ステーションのペアのための唯一のエントリがある場合は塩基溶液である(それは少し不格好だ、私はコーヒーの私の最初の杯を終えていません):

##Some sample data 
df <- data.frame(StartStation.Id=sample(LETTERS[1:10], 100, replace =T), 
       EndStation.Id=sample(LETTERS[11:20], 100, replace =T), 
       Duration=runif(100, 0.1,100)) 
    res <- tapply(df$Duration, paste0(df$StartStation.Id, df$EndStation.Id), function(x) x/median(x)) 
    res <- data.frame(StartStation.Id=sapply(strsplit(rep(names(res), sapply(res, length)), ""), "[", 1), 
         EndStation.Id=sapply(strsplit(rep(names(res), sapply(res, length)), ""), "[", 2), 
         durn=unlist(res)) 
res[res$durn==1,] <- NA 
+0

ありがとうemiliman5。そして、そうです、それは私がしたいことです。この実装を試してみます。私はそれが見えるグループ化機能を見直さなければならない。 –

関連する問題