2016-12-06 14 views
-1

Rには比較的新しいので、Rのすべてのコードを「ベクトル化」するのには苦労します。観測値を観測値の最小値に設定するR

IDの最小時間となるようにデータフレームに値を設定する必要があります。

ID isTrue RealTime MinTime 
1 TRUE  16 
1 FALSE 8 
1 TRUE  10 
2 TRUE  7 
2 TRUE  30 
3 FALSE 3 

に点灯させる:完全に、次の作品

ID isTrue RealTime MinTime 
1 TRUE  16  10 
1 FALSE 8   
1 TRUE  10  10 
2 TRUE  7   7 
2 TRUE  30  7 
3 FALSE 3 

。ただし、実行には10分かかりますが、これは理想的ではありません。

for (i in 1:nrow(df)){ 

    if (df[i,'isTrue']) { 
     prevTime <- sqldf(paste('Select min(MinTime) from dfStageIV where ID =',df[i,'ID'],sep=" "))[1,1] 
     if (is.na(prevTime) | is.na(df[i,'MinTime']) | df[i,'MinTime'] < prevTime){ 
     df[i,'MinTime']<-dfStageIV[i,'RealTime'] 
     } else { 
     dfStageIV[i,'MinTime']<-prevTime 
     } 
    } 
} 

どうすればよいですか? forループとdoループをRで使うのは最良の方法ではありません。私はapply()とaggregate.data.frame()関数を見てきましたが、これを行う方法を理解できません。誰かが私を正しい方向に向けることができますか?とても有難い!!

+0

は 'ave'を見てみましょう。 – lmo

+0

ありがとう、最初の試みは近くだった。 df $ MinTime <-ave(df $ RealTime、df $ ID、FUN = min)。しかし、どのように私はそれが本当の真実であるものを取るようになるのですか? – user2535309

+0

df $ MinTime <-ave(df $ RealTime、df $ ID、df $ isTrue、FUN = min) df $ MinTime <-ifelse(df $ isTrue、df $ MinTime、NA)。これは、警告のトンを返しますが、動作します。ありがとう! – user2535309

答えて

0

誰かがAVE()関数と次の作品を使用して提案し、それが警告のトンを返すが高速である:ここ

df$MinTime<-ave(df$RealTime,df$ID, df$isTrue, FUN = min) 
df$MinTime<-ifelse(df$isTrue, df$MinTime,NA). 
0

チェーンがdplyrのほうがずっと速いはずです。ここでは、データフレームをIDとグループの両方でグループ化し、グループレベルで最小値を取得します。その後、もう一度グループを解除して、Fの最小値を削除するだけです。

library(dplyr) 
df %>% 
    group_by(ID, isTrue) %>% 
    mutate(Min.all = min(RealTime)) %>% 
    ungroup() %>% 
    transmute(ID, isTrue, RealTime, MinTime = ifelse(isTrue == T, Min.all, "")) 

出力:

# A tibble: 6 × 4 
    ID isTrue RealTime MinTime 
    <int> <lgl> <int> <chr> 
1  1 TRUE  16  10 
2  1 FALSE  8   
3  1 TRUE  10  10 
4  2 TRUE  7  7 
5  2 TRUE  30  7 
6  3 FALSE  3   

私は本当にあなたがデータフレームの操作の多くをやっているつもりなら、あなたがdplyrに慣れるお勧めします。

+0

ありがとうございます。私はdplyrライブラリに潜んでいますが、これはかなり役に立ちます。私が他の誰かの提案から下に投稿したように、ave()関数はIDでグループ分けされており、 – user2535309

2

avepmax、及びis.naを使用して、2つの線基地R溶液です。最初の行で

df 
    ID isTrue RealTime MinTime 
1 1 TRUE  16  10 
2 1 FALSE  8  NA 
3 1 TRUE  10  10 
4 2 TRUE  7  7 
5 2 TRUE  30  7 
6 3 FALSE  3  NA 

を返し

# calculate minimum for each ID, excluding FALSE instances 
df$MinTime <- ave(pmax(df$RealTime, (!df$isTrue) * max(df$RealTime)), df$ID, FUN=min) 
# turn FALSE instances into NA 
is.na(df$MinTime) <- (!df$isTrue) 
df$isTrue

がTRUEであるかdata.frameにおける最大リアルタイム値場合、pmaxは観測ベクターを構築するために使用されます。この新しいベクトルは、最小計算で使用されます。 FALSEの値は2行目でNAに設定されています。当該

データ

df <- read.table(header=T, text="ID isTrue RealTime 
1 TRUE  16 
1 FALSE 8 
1 TRUE  10 
2 TRUE  7 
2 TRUE  30 
3 FALSE 3") 
0

コードはむしろ半分と半分以上(適切にベクトル化)SQLまたはR内のすべての中ですべての操作を実行して簡略化することができます。すでにいくつかのRソリューションがあるので、問題がカスタム自己結合を集約することを示すSQLソリューションがあります。

library(sqldf) 
sqldf("select a.*, min(b.RealTime) minRealTime 
     from df a 
     left join df b on a.ID = b.ID and a.isTRUE and b.isTRUE 
     group by a.rowid") 

与える:

ID isTrue RealTime minRealTime 
1 1 TRUE  16   10 
2 1 FALSE  8   NA 
3 1 TRUE  10   10 
4 2 TRUE  7   7 
5 2 TRUE  30   7 
6 3 FALSE  3   NA 
関連する問題