Сравнение всех элементов в ячейке строки со всеми элементами в ячейке в другой строке без учета порядка - PullRequest
2 голосов
/ 01 июля 2019

У меня есть лист с двумя столбцами A и B, как показано на рисунке, в которых есть записи, разделенные запятой (,).Я хочу сравнить эти 2 строки ячейка за ячейкой в ​​R так, чтобы она возвращала 1 (TRUE) только тогда, когда

  1. Когда все записи совпадают в обеих строках
  2. Порядокне учитывается при сравнении (строка 5 на изображении)

Пример ожидаемого вывода приведен в столбце Результат изображения.Я использовал команду match в R, но она возвращает только 1 (True) для строки 2, а не для строки 5, которая имеет те же записи, но в другом порядке.

Может кто-нибудь предложить какой-либо пакет или функциюв R это поможет мне сделать это (предпочтительно решение, в котором нет петель), поскольку я хочу использовать это для набора данных, который имеет тысячи строк.

enter image description here

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Это должно помочь:

# example data
dt = data.frame(A = c("1,ab", "1,x,df"),
                B = c("2,ab", "1,df,x"),
                stringsAsFactors = F)

# vectorised function to check matches
ff = function(x,y) as.numeric(identical(sort(unlist(strsplit(x,","))), 
                                        sort(unlist(strsplit(y,",")))))
ff = Vectorize(ff)

# apply function
dt$Result = ff(dt$A, dt$B)

dt

#        A      B Result
# 1   1,ab   2,ab      0
# 2 1,x,df 1,df,x      1

Если после запятых может быть несколько пробелов, вы можете использовать функцию trimws, например, sort(trimws(unlist(strsplit(x,",")))) в указанной выше функции.

0 голосов
/ 01 июля 2019

Вот вариант с tidyverse

library(tidyverse)
rownames_to_column(dt, 'rn') %>%
  separate_rows(A, B) %>% 
  group_by(rn) %>% 
  summarise(Result = as.integer(all(sort(A) == sort(B)))) %>% 
  select(Result) %>% 
  bind_cols(dt, .)

данные

dt <- structure(list(A = c("1,ab", "1,x,df"), B = c("2,ab", "1,df,x"
)), class = "data.frame", row.names = c(NA, -2L))
...