2017-07-08 34 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.過濾出數字4 & 5,以便我可以創建一個單獨的函數與不同的Time過濾器。稍後創建另一個不同的功能,將前兩個函數合併爲一個。 或 B.在相同的功能中創建一個不同的Time過濾器專門用於編號4 & 5。

我試過A,通過使用filter (getallT, Number >= 3) %>%但是不起作用。如果可能的話,我寧願和B一起去。所以像... 對於ID號1-3:過濾器(!之間(時間,1,2)) 對於ID號4-5:在同一個函數內過濾(!之間(時間1.5,2.3))。 我一直在嘗試一些事情在過去一天,但不斷收到錯誤信息,如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

您能否提供一個可重複使用的小例子 – akrun

+1

請問您如何提出包括可重現數據集的問題。 https://開頭計算器。com/questions/5963269/how-to-make-a-r-re-reproducible-example – cmaher

+0

我確實有忘記添加的壞習慣! Woops,謝謝你的提醒! –

回答

1

這個函數是有點混亂:

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

主要是因爲它需要一個df參數,其內沒有,並使用兩個data.frames從race_dfgetallT外部環境。您撥打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函數並將它們與|運算符(「或」)相加,filter然後將評估爲「篩選df其中(標準a AND B)OR(標準c和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中自學成才,也是一般的編程新手。我相信你可以告訴。有沒有一種方法可以爲'數字'4和5添加另一個與'Time'有關的'filter'?我不斷收到返回相同的錯誤消息。 –

+1

啊,是的,我重新閱讀你的問題,現在看看你希望做什麼 - 請看我修改後的答案。 – cmaher

+0

感謝您的幫助!我的代碼看起來更好,現在功能正常! –

相關問題