2017-02-13 40 views
0

我有以下示例格式的data.table。如何將不同的多參數函數應用於data.table的每一行?

dt <- data.table(l = c("apple","ball","cat"), 
       m = c(1,2,3), 
       n = c("I ate apple", "I played ball", "cat ate pudding")) 

我想申請sub爲與圖案從另一列(l)今後各行的列(n)。我將如何做到這一點?

我找的是輸出,

   l m    n o 
     1: apple 1  I ate apple  I ate 
     2: ball 2 I played ball I played 
     3: cat 3 cat ate pudding ate pudding 

我一直在使用這種方法mapply(do.call, list(sub), ...)與內data.table賦值運算符,但參數sub(模式,替換字符串)必須嘗試do.call的嵌套列表,我堅持如何正確寫入。

+2

爲什麼不'DT [,地圖(子,午, '',N)]'?編輯:這將給我一個有名的向量/列表,所以我們真正想要的是將列表中的返回值封裝爲'dt [,o:=(Map(sub,l,'',n))]] – Shape

+0

@Shape謝謝您!我的方法現在似乎不必要的複雜。我試圖想出一種方法,而不是'sub',我可以有一個不同的函數列表。不過,您的代碼在我的情況下完成了這項工作。如果您想將其作爲答案發布,請繼續。 – Naumz

+0

@Shape我同意你應該發佈。我會用'dt [,mapply(sub,sprintf(「?%s?」,l),「」,n,USE)。NAMES = FALSE)] - 處理名稱問題,以及這些模式可能在它們周圍有空格(OP大概也希望刪除)。 – Frank

回答

3

因此,我們希望做一個橫行計算,並返回它定義爲一個新的列o

mapply絕對是正確的功能的家庭,但mapply(和sapply)將簡化其輸出一個列表,他們前把它返還。 data.table喜歡列表。 Map只是一個mapply(..., simplify = FALSE)的表達快捷方式,它不會修改回報。

下面我們確實是經過計算的,但它仍然是不完全正確。 (data.table解釋表輸出爲單獨列)

> dt[, Map(sub, l, '', n)] 
    apple  ball   cat 
1: I ate I played ate pudding 

因此,我們要進一步去和一個列表中的包裹,讓我們輸出後:

>dt[, .(Map(sub, l, '', n))] 
      V1 
1:  I ate 
2: I played 
3: ate pudding 

現在我們可以這個分配使用:=

> dt[, o := Map(sub, l, '', n)] 
> dt 
     l m    n   o 
1: apple 1  I ate apple  I ate 
2: ball 2 I played ball I played 
3: cat 3 cat ate pudding ate pudding 

編輯:正如指出的那樣,這將導致o是一個列表列。

我們可以通過使用標準mapply來避免這種情況,儘管我傾向於採用Map的一種萬能方法(每一行創建一個單一輸出,該輸出列入一個列表中,無論輸出如何,這將總是工作,然後我們就可以在最後類型轉換。)

dt[, o := mapply(sub, l, '', n)]

+2

這將使'dt $ o'成爲一個嵌入式列表,所以我認爲'mapply'實際上更合適 – thelatemail

+0

,應該已經檢查過我的列類,但我仍然喜歡'Map',然後轉換爲字符。我通常不相信簡化。 'Map'的行爲總是一樣的。我會通過其他方式添加 – Shape

+1

你錯了「data.table喜歡列表。」 Data.table喜歡列的列表,它*允許*列是列表,但後者是混亂的工作和總是會。 – Frank

1

我們可以通過paste荷蘭國際集團「L」的內容做一個量化的方法,以此作爲在subpattern說法刪除子字符串並創建新列'o'

dt[, o := trimws(sub(paste(l, collapse="|"), "", n))] 
dt 
#  l m    n   o 
#1: apple 1  I ate apple  I ate 
#2: ball 2 I played ball I played 
#3: cat 3 cat ate pudding ate pudding 
相關問題