2015-04-23 62 views
9

我在dplyr中變異行的子集時遇到問題。我現在用的鏈接命令:%>%說:R如何變異行的子集

data <- data %>% 
    filter(ColA == "ABC") %>% 
    mutate(ColB = "XXXX") 

這工作得很好,但問題是,我希望能夠選擇整個原始表,看到了變異只應用於數據的子集,我有指定。我的問題是,當我在此之後查看數據時,我只能看到data的子集及其更新的ColB信息。

我也想知道如何使用data.table來做到這一點。

謝謝。

回答

9

使用data.table,我們會做:

setDT(data)[colA == "ABC", ColB := "XXXX"] 

和值被修改就地,不像if-else,which'd複製整列,以取代只是那些排在條件滿足。

我們將此轉爲作爲參考。您可以在new HTML vignettes中閱讀更多關於它的內容。

+0

謝謝。這工作。我該如何做一個多重標準過濾器?我嘗試了以下,但它似乎並不是正確的語法.'setDT(data)[(colA ==「ABC」)&(colC ==「DEF」),ColB:=「XXXX」]' –

+0

@ user1991118 *是*正確的語法 - 也許你可以顯示一個可重複的例子。我能想到的唯一可能就是你打算使用'|'代替'&'。 – eddi

+0

這確實是正確的語法。我使用了錯誤的變量。這是工作。 –

4

當您使用filter()時,實際上是刪除與指定條件不匹配的行,因此它們不會顯示在最終數據集中。

您的數據框中是否已經存在ColB?如果是這樣,

data %>% 
    mutate(ColB = ifelse(ColA == "ABC", "XXXX", ColB)) 

將改變ColB"XXXX"ColA == "ABC",並保留原樣,否則。如果ColB不存在,那麼你將有指定什麼爲行,其中ColA != "ABC"做,例如:

data %>% 
    mutate(ColB = ifelse(ColA == "ABC", "XXXX", NA)) 
0

另一種選擇是進行聯合和使用相同的數據反連接的後續組合。這需要一個主鍵:

data <- data %>% 
    filter(ColA == "ABC") %>% 
    mutate(ColB = "XXXX") %>% 
    rbind_list(., anti_join(data, ., by = ...)) 

例子:

mtcars_n <- mtcars %>% add_rownames 
mtcars_n %>% 
    filter(cyl > 6) %>% 
    mutate(mpg = 1) %>% 
    rbind_list(., anti_join(mtcars_n, ., by = "rowname")) 

這很可能比任何其他方法要慢得多,但有用通過擴展現有的管道立竿見影。