Получить общие элементы (из одной строки) между столбцами строк, разделенных запятыми, с сохранением имен строк - PullRequest
2 голосов
/ 18 июня 2020

У меня есть фрейм данных с некоторым столбцом, содержащим строки, разделенные запятыми:

     colA     colB

1    a,b,c,ñ  d,b,e
2    f,g,h    f,g,m,p
3    i,j,k    f,o,j

Я хотел бы получить общие элементы между обоими столбцами, соответствующими одной и той же строке. Итак, мой желаемый результат:

    colA    colB
1     b       b
2    f,g     f,g
3     j       j

Я пытался преобразовать эти столбцы в списки списков, чтобы выполнить пересечение после этого, но у меня возникли некоторые проблемы, поэтому я хотел бы знать, есть ли что-то Полегче. Как я могу это получить?

Ответы [ 3 ]

2 голосов
/ 18 июня 2020

Если вы имеете дело с большим набором данных, вы можете попробовать cSplit_l из "splitstackshape":

library(splitstackshape)
temp <- cSplit_l(df, names(df), ",", stripWhite = TRUE, type.convert = FALSE, drop = TRUE)
temp[, 1:2] <- vapply(Map(intersect, temp[[1]], temp[[2]]), toString, character(1L))
setnames(temp, names(df))[]
##    colA colB
## 1:    b    b
## 2: f, g f, g
## 3:    j    j

Непонятно, зачем вам нужно одинаковое содержимое в обоих этих столбцах.

2 голосов
/ 18 июня 2020

Другой вариант: str_extract

library(stringr)
library(dplyr)
library(purrr)
df %>% 
   transmute(colA = map_chr(str_extract_all(colA, 
              str_replace_all(colB, ",", "|")), toString), 
          colB = colA)
#   colA colB
#1    b    b
#2 f, g f, g
#3    j    j
2 голосов
/ 18 июня 2020

мы можем использовать это

 df[,1:2] <- apply(df,1, function(X) paste(unlist(strsplit(X[1],","))[unlist(strsplit(X[1],",")) %in% unlist(strsplit(X[2],","))],collapse=",") )


   > df
  colA colB
1    b    b
2  f,g  f,g
3    j    j

Данные:

df <- structure(list(colA = structure(1:3, .Label = c("a,b,c,ñ", "f,g,h", 
"i,j,k"), class = "factor"), colB = structure(1:3, .Label = c("d,b,e", 
"f,g,m,p", "f,o,j"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...