2017-07-08 10 views
0

私は以前に答えられた質問の助けを借りていくつかのコードを書いた。この出力ましたRの同じ関数内に複数のフィルタを作成するには?

getT <- function(df, ID, Number){ 
    df %>% 
    group_by(ID, Number) %>% 
    mutate(Distance = finish - begin) %>% 
    select(-begin,-finish,-symbols) %>% 
    nest() %>% 
    mutate(data = map(data, ~ filter(.x, Distance == max(Distance)))) %>% 
    unnest() 
} 

getallT <- as.data.frame(getT(df)) 

getTID <- function(df, ID) { 
    subset(x = getallT, subset = (ID)) 
} 

ID  Number  Time  Distance 
33   1  2.00   870 
33   2  1.98   859 
33   3  0.82   305 
33   4  2.02   651 
33   5  2.53   502 

私はTimeことによってそれをフィルタリングしたかったので、私は(下のポストに感謝)このコードを使用:

getHLN <- function(df, ID) { 
    getallT %>% filter (ID ==id & !between(Time, 1.50, 2.10)) 
} 
当初、私はこのコードを持っていました

これは今この出力を与える:

ID Number Time Distance 
1 33  3 0.82  305 
2 33  4 2.02  651 
3 33  5 2.53  502 

しかし今私は問題を抱えているので、いずれかの方法が不思議に残っています。 A.別のTimeフィルタを使用して別の機能を作成できるように、番号4 & 5をフィルタします。前の2つの機能を1つに統合する別の異なる機能を後で作成します。 または B.同じ機能内で、別の番号& 5のTimeフィルタを作成します。

filter (getallT, Number >= 3) %>%を使用してAしましたが動作しません。可能であればBと一緒に行きたいと思う。 ID番号4〜5の場合は、同じ機能内でフィルタ(!間(時間1.5,2.3))を入力してください。 ID番号が1-3の場合:filter(!between(Time、1,2)) 私は過去の日にいくつか試してみましたが、エラーメッセージが表示され続けています。Error in filter_impl(.data, quo) : Evaluation error: operations are possible only for numeric, logical or complex types.

私はここにあるものを試してきましたが、ここでhttp://genomicsclass.github.io/book/pages/dplyr_tutorial.html

は、すべてのヘルプははるかに高く評価されるだろう

df <- data.frame(ID=rep(33,5), 
       Number=1:5, 
       Time=c(2.00,1.98,0.82,2.02,2.53), 
       Distance=c(870,859,305,651,502)) 

例のデータセットです。

+1

あなたはSO再現可能なデータセットを含むの質問をよう習慣に取得してください小さな再現性の例 – akrun

+1

を提供することができます。 https:// stackoverflow。com/questions/5963269/how-to-make-a-great-r-reproducible-example – cmaher

+0

私はそれを追加することを忘れるという悪い習慣があります!うわー、思い出してくれてありがとう! –

答えて

1

この関数はやや紛らわしいです:

getHLN <- function(df, ID) { 
    data_df1 <- getT(race_df) 
    subset(x = getallT, subset = (ID)) %>% 
    filter (!between(Time, 1.50, 2.10)) 
} 

それが内ないdf引数を取り、race_dfgetallTに外部環境から2 data.framesを使用しているため。 subsetへのあなたのコールはまた、神秘的なものです。それが起きると、関数はsubsetで始まる式が返ってくるものを返して、data_df1を投げ捨てます。

getHLN <- function(df, ID) { 
    # this gets locally assigned within the function and then 
    # becomes unreachable once the function ends 
    data_df1 <- getT(df) 
    # this expression would produce the last value of the function 
    # and so the function would return its value 
    subset(x = getallT, subset = (ID)) %>% 
    filter (!between(Time, 1.50, 2.10)) 
} 

私たちは、あなたは彼らが「と」論理として評価されているように、括弧内の各を包む、説明し、その後に両方を追加し、あなたが基準の両方のセットのためのID %in% ... & !between()ロジックを作成することにより、説明フィルタリングの並べ替えを行うことができますfilter関数を呼び出して、|演算子( "or")と結合します。filterは、 "filter df where(criteria a AND B)OR(criteria c AND d)"と評価されます。

getHLN <- function(df) { 
    df %>% filter(
    (Number %in% 1:3 & !between(Time, 1, 2)) | 
     (Number %in% 4:5 & !between(Time, 1.50, 2.10)) 
    ) 
} 
+0

さらに詳しく調べてみると、私のdata_df1は無意味だと分かったが、今はもっと洗練されたコードを見せてくれて、ありがとう。私はRで自己学習しており、一般的なプログラミングにも新しくなっています。私はあなたが言うことができると確信しています。 'Number' 4と5の' Time'に関連する別の 'filter'を追加する方法はありますか?同じエラーメッセージが返され続けます。 –

+1

ああ、私はあなたの質問を再読し、あなたが何を望んでいるのかを見ています - 私の改訂された答えを見てください。 – cmaher

+0

ご協力ありがとうございます!私のコードは良く見え、今は機能的です! –

関連する問題