как объединить несколько строк, отличающихся только перестановкой - PullRequest
1 голос
/ 25 мая 2019

как объединить несколько строк, отличающихся только перестановкой?

Скажите.данные в data.frame выглядят так:

V1, V2
1, 2
3, 2
2, 1
5, 1
7, 8
1, 9
5, 1

1, 2 и 2, 1 должны обрабатываться как одна и та же строка.Таким образом, существует два 1, 2.

ожидаемого результата:

V1, V2, V3
1, 2, 2
3, 2, 1
5, 1, 2
7, 8, 1
1, 9, 1

Многие решения, которые я искал, агрегировали только один столбец на основе другого.Таким образом, эти решения могут агрегировать 5, 1 как 5, 2.

И unique также не могут агрегировать 1, 2 и 2, 1.

Не найдено решение для моего ожидаемого результата.Любые ссылки и советы?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Одна возможность с использованием dplyr и purrr может быть:

df %>%
 group_by(grp = paste(exec(pmax, !!!.), exec(pmin, !!!.), sep = "_")) %>%
 add_count(grp, name = "V3") %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)

     V1    V2    V3
  <int> <int> <int>
1     1     2     2
2     3     2     1
3     5     1     2
4     7     8     1
5     1     9     1

Или только с dplyr:

df %>%
 group_by(grp = paste(pmax(V1, V2), pmin(V1, V2), sep = "_")) %>%
 add_count(grp, name = "V3") %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)

Или:

df %>%
 rowwise() %>%
 mutate(grp = paste(sort(c(V1, V2)), collapse = "_")) %>%
 group_by(grp) %>%
 add_count(grp, name = "V3") %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)

Используя ту же логику с base R:

df$grp <- with(df, paste(pmax(V1, V2), pmin(V1, V2), sep = "_"))
df$V3 <- with(df, ave(grp, grp, FUN = length))
df <- df[!duplicated(df$grp), ][, -3]
0 голосов
/ 25 мая 2019

Опция, использующая base R

aggregate(cbind(V3 = rep(1, nrow(df1)))~., data =  t(apply(df1, 1, sort)), sum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...