获取字符串组合的唯一列表,而不考虑顺序

时间:2019-01-09 20:10:29

标签: r

我有一个数据框,其中有两列以相反的顺序重复自身(即,两列的配对将始终相同)

示例:

col1 <- c('a', 'c', 'g', 'd', 'e', 'b', 'f', 'h')
col2 <- c('b', 'd', 'h', 'c', 'f', 'a', 'e', 'g')

df <- data.frame(col1, col2, stringsAsFactors = FALSE)

我想添加一列作为这些组合的标识符,而不考虑顺序(例如,第1行和第6行是等效的)。最终的解决方案如下所示:

  col1 col2 ID
1    a    b  1
2    c    d  2
3    g    h  3
4    d    c  2
5    e    f  4
6    b    a  1
7    f    e  4
8    h    g  3

3 个答案:

答案 0 :(得分:1)

df$grp <- interaction(do.call(pmin, df[1:2]), do.call(pmax, df[1:2]))

df
#   col1 col2 grp
# 1    a    b a.b
# 2    c    d c.d
# 3    g    h g.h
# 4    d    c c.d
# 5    e    f e.f
# 6    b    a a.b
# 7    f    e e.f
# 8    h    g g.h

如果您想要数字,则可以这样做

df$grp <- as.integer(df$grp)

df
#   col1 col2 grp
# 1    a    b   1
# 2    c    d   6
# 3    g    h  16
# 4    d    c   6
# 5    e    f  11
# 6    b    a   1
# 7    f    e  11
# 8    h    g  16

答案 1 :(得分:1)

data.table oneliner

您使用by创建apply
apply (df, 1, function(x) paste0( sort( x ), collapse='' ) )
导致
[1] "ab" "cd" "gh" "cd" "ef" "ab" "ef" "gh"
col1和col2的排序组合。

基于此向量,data.table可以为每个唯一元素创建组号,您可以使用.GRP将其传递给新的ID变量。

library(data.table)

setDT(df)[, ID := .GRP, by = apply (df, 1, function(x) paste0( sort( x ), collapse='' ) ) ][]

#    col1 col2 ID
# 1:    a    b  1
# 2:    c    d  2
# 3:    g    h  3
# 4:    d    c  2
# 5:    e    f  4
# 6:    b    a  1
# 7:    f    e  4
# 8:    h    g  3

答案 2 :(得分:0)

使用dplyr和purrr的解决方案:

LinearLayoutManager