2017-05-23 71 views
2

我遇到以下問題。參數'pattern'的長度> 1,並且僅使用第一個元素 - GSUB()

table <- data.frame(col1 = c("cars1 gm", "cars2 gl"), col2 = c("cars1 motor mel", "cars2 prom del")) 

     col1   col2 
1 cars1 gm cars1 motor mel 
2 cars2 gl cars2 prom del 

table$word <- gsub(table$col1, ' ', table$col2) 

警告消息:在GSUB(表$ COL1, 「」,表$ COL2):參數 '圖案' 具有長度> 1且僅第一個元素將被用來

如何創建一個名爲'word'的新列,其中只包含col1的值,而col1不會出現在col1中?

 col1   col2  word 
1 cars1 gm cars1 motor mel motor mel 
2 cars2 gl cars2 prom del prom del 

回答

4

您可以使用gsub建立自己查找,然後sapply在列執行感興趣的gsub

table$col1 <- gsub(" ", "|", table$col1) 
table$word <- sapply(1:nrow(table), function(x) gsub(table$col1[x], "", table$col2[x])) 

table 
#  col1   col2  word 
#1 cars1|gm cars1 motor mel motor mel 
#2 cars2|gl cars2 prom del prom del 

使用類似的想法,上面的回答,但使用mapply代替sapply

table$word <- mapply(function(x, y) gsub(gsub(" ", "|", x), "", y), 
            table$col1, 
            table$col2) 
0

可以在col1col2分割字符串,如的話可能不會以相同的順序,然後您可以選擇的話比只使用setdiff出現在col2

table$word=sapply(1:nrow(table),function(i) 
paste(setdiff(unlist(strsplit(table$col2[i]," ")), 
unlist(strsplit(table$col1[i]," "))),collapse=" ")) 

這將返回:

col1   col2  word 
1 cars1 gm cars1 motor mel motor mel 
2 cars2 gl cars2 prom del prom del 
2

您可以使用mapply

#Make sure you read your data with stringsAsFactors = FALSE, 
table<-data.frame(col1=c("cars1 gm","cars2 gl"), 
        col2=c("cars1 motor mel", "cars2 prom del"), stringsAsFactors = FALSE) 

table$word <- mapply(function(x, y) 
        trimws(gsub(sapply(strsplit(x, ' '), paste, collapse = '|'), '', y)), 
        table$col1, table$col2) 
table 
#  col1   col2  word 
#1 cars1 gm cars1 motor mel motor mel 
#2 cars2 gl cars2 prom del prom del 
1

您可以使用mapplypastestrsplit這樣。

table$word <- mapply(function(x, y) paste(y[!(y %in% x)], collapse=" "), 
        strsplit(as.character(table$col1), split=" "), 
        strsplit(as.character(table$col2), split=" ")) 

這裏,strsplit在「」上分割一個字符向量並返回一個列表。這兩個列表被送到mapply,它檢查每個列表的相應值並返回不在第一個列表中的第二個列表的值。生成的向量與paste及其摺疊參數一起粘貼。

返回

table 
     col1   col2  word 
1 cars1 gm cars1 motor mel motor mel 
2 cars2 gl cars2 prom del prom del 
相關問題