[英]Number of Matches Between Two Comma Separated Factors in a Data Frame
我有一個看起來像這樣的數據框:
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
一種替代方法是將第一列視為正則表達式以在第二列中進行搜索,並利用“ 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"
的正則表達式搜索模式,並將其用作搜索模式在上面演示的每個“字符串”函數中。
您可以使用:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.