2014-03-28 82 views
0

我有一個數據幀,看起來是這樣的:在數據幀號兩個逗號分隔因素之間的匹配

Row ID1 ID2 Colors1  Colors2 
1  1  2  Green, Blue Red, Orange 
2  1  3  Green, Orange Orange, Red 

我想創建一個計算,告訴我的色彩計數共同COLORS1之間和Colors2。所需的結果是:

Row ID1 ID2 Colors1    Colors2   Common 
1  1  2  Green, Blue, Purple Green, Purple 2  #Green, Purple 
2  1  3  Green, Orange   Orange, Red  1  #Orange 

回答

1

可以使用:

col1 <- strsplit(df$Colors1, ", ") 
col2 <- strsplit(df$Colors2, ", ") 
df$Common <- sapply(seq_len(nrow(df)), function(x) length(intersect(col1[[x]], col2[[x]]))) 

df <- data.frame(Colors1 = c('Green, Blue', 'Green, Blue, Purple'), Colors2 = c('Green, Purple', 'Orange, Red'), stringsAsFactors = FALSE) 
col1 <- strsplit(df$Colors1, ", ") 
col2 <- strsplit(df$Colors2, ", ") 
df$Common <- sapply(seq_len(nrow(df)), function(x) length(intersect(col1[[x]], col2[[x]]))) 
df 
#    Colors1   Colors2 Common 
# 1   Green, Blue Green, Purple  1 
# 2 Green, Blue, Purple Orange, Red   0 
+0

謝謝,它工作。這份寶貴的聲明對我來說很難理解 - 任何進一步的解釋都將不勝感激。 – user2980491

+0

更具體地說,爲什麼需要sapply?爲什麼代碼長度(intersect(col1,col2))不起作用? – user2980491

2

的另一種方法是治療所述第一列的正則表達式的搜索第二列,並利用「stringi」包來促進向量化的模式搜索。

df <- structure(list(Colors1 = c("Green, Blue, Purple", "Green, Blue", 
"Green, Blue, Purple"), Colors2 = c("Green, Purple", "Green, Purple", 
"Orange, Red")), .Names = c("Colors1", "Colors2"), row.names = c("2", 
"21", "3"), class = "data.frame") 

df 
#    Colors1  Colors2 
# 2 Green, Blue, Purple Green, Purple 
# 21   Green, Blue Green, Purple 
# 3 Green, Blue, Purple Orange, Red 

library(stringi) 
stri_extract_all_regex(df$Colors2, gsub(", ", "|", df$Colors1)) 
# [[1]] 
# [1] "Green" "Purple" 
# 
# [[2]] 
# [1] "Green" 
# 
# [[3]] 
# [1] NA 

stri_count_regex(df$Colors2, gsub(", ", "|", df$Colors1)) 
# [1] 2 1 0 

基本上,我所做的有使用gsub的「COLORS1」列轉換爲看起來像"Green|Blue|Purple"代替"Green, Blue, Purple"和使用正則表達式搜索模式,由於在每個搜索模式「弦我「功能,我上面演示。

+2

你可以使用一些'stri_replace'函數:) – bartektartanus