Как нумеровать уникальные пары X, Y - PullRequest
0 голосов
/ 15 января 2019

Хорошо, у меня есть следующий data.frame:

v1<-c(456,234,981,776,112,998)
v2<-c(981,112,456,998,234,776)
df<- data.frame(v1,v2)

Я хочу получить дополнительную переменную с числовым количеством пар значений v1 и v2. Хитрость в том, что мне нужно нумеровать их по уникальным парам, например, (456,981 и 981,456) должны быть пронумерованы 1.

Таким образом, результат будет примерно таким:

v1<-c(456,234,981,776,112,998)
v2<-c(981,112,456,998,234,776)
v3<-c(1,2,1,3,2,3)
df<- data.frame(v1,v2,v3)

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Как насчет использования dplyr. По сути, вы бы отсортировали столбцы для каждой строки. Не уверен, будет ли это более эффективным или нет. Очевидно, это намного больше строк.

library(dplyr)

df <- data.frame(v1,v2)

# Sort by v1 and v2 elements by row
df.new <- df %>%
  mutate(z1 = pmin(v1,v2),
         z2 = pmax(v1,v2))

# Build a distinct coding table
df.codes <- df.new %>%
  distinct(z1, z2) %>%
  mutate(v3 = 1:n())

# Join it back together
df.new %>%
  left_join(df.codes, by = c("z1", "z2")) %>%
  select(v1, v2, v3)
0 голосов
/ 15 января 2019

Вы можете отсортировать строки и использовать match, т.е.

v1 <- do.call(paste, data.frame(t(apply(df, 1, sort))))
match(v1, unique(v1))
#[1] 1 2 1 3 2 3
...