我有一个数据框,其中有两列以相反的顺序重复自身(即,两列的配对将始终相同)
示例:
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
答案 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