比较一行中某个单元格中的所有元素与另一行中某个单元格中的所有元素,而不考虑顺序

时间:2019-07-01 17:03:54

标签: r excel comparison match rstudio

我有一个工作表,其中有两列Potential time zones: [Antarctica/McMurdo, Pacific/Niue, Pacific/Samoa, Pacific/Tongatapu, Pacific/Enderbury, Etc/GMT+11, NZ, Antarctica/South_Pole, Etc/GMT-13, Pacific/Pago_Pago, Pacific/Midway, Pacific/Fakaofo, US/Samoa, Pacific/Auckland] Ambiguous date, candidates are [2019-10-03, 2019-10-02] A,如图中所示,它们的条目之间用逗号(B)隔开。 我想在R中逐个单元比较这2行,以便仅在以下情况下才返回1(,

  1. 当所有条目在两行中都匹配时
  2. 比较时不考虑顺序(图像中的行5)

图像的“结果”列中给出了预期的示例输出。 我在R中使用过match命令,但它只为第2行而不是第5行返回1(TRUE),第5行具有相同的条目,但顺序不同。

有人可以建议R中的任何软件包或函数来帮助我做到这一点(最好是没有循环的解决方案),因为我想在具有数千行的数据集上使用它。

enter image description here

2 个答案:

答案 0 :(得分:1)

这应该有帮助:

# 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,","))))

答案 1 :(得分:0)

这里是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))