Создайте data_frame, используя уникальные столбцы в R [duplicate]

Это наиболее обсуждаемый аспект спецификации Selectors Level 4. С помощью этого селектора вы сможете стилизовать элемент в соответствии с его дочерним элементом, используя восклицательный знак после данного селектора (!).

Например:

body! a:hover{
   background: red;
}

установит красный цвет фона, если пользователь наводится на любой якорь.

Но нам нужно ждать реализации браузеров: (

6
задан Matt O'Brien 10 November 2016 в 00:00
поделиться

4 ответа

Есть много способов сделать это, вот один:

unique(t(apply(df, 1, sort)))
duplicated(t(apply(df, 1, sort)))

Один дает уникальные строки, другой - маску.

7
ответ дан jimmyb 19 August 2018 в 09:08
поделиться
  • 1
    Этот подход возвращает первое уникальное появление строки (строки 1,2,3), но не возвращает повторяющиеся строки (строки 1,4) / уникальные строки (2,3), как определено исходным плакатом. – atreju 1 September 2015 в 10:05

Если это всего лишь два столбца, вы также можете использовать pmin и pmax, например:

library(data.table)
unique(as.data.table(df)[, c("V1", "V2") := list(pmin(V1, V2),
                         pmax(V1, V2))], by = c("V1", "V2"))
#    V1 V2
# 1:  a  b
# 2:  b  d
# 3:  c  e

Аналогичный подход с использованием «dplyr» может быть:

library(dplyr)
data.frame(df, stringsAsFactors = FALSE) %>% 
  mutate(key = paste0(pmin(X1, X2), pmax(X1, X2), sep = "")) %>% 
  distinct(key)
#   X1 X2 key
# 1  a  b  ab
# 2  b  d  bd
# 3  c  e  ce
6
ответ дан A5C1D2H2I1M1N2O1R2T1 19 August 2018 в 09:08
поделиться

Вы можете использовать igraph, чтобы создать неориентированный граф, а затем преобразовать обратно в файл data.frame

unique(get.data.frame(graph.data.frame(df, directed=FALSE),"edges"))
3
ответ дан mnel 19 August 2018 в 09:08
поделиться

Если все элементы являются строками (черт, даже если нет, и вы можете их принуждать), то один трюк состоит в том, чтобы создать его как data.frame и использовать некоторые трюки dplyr на нем.

library(dplyr)
df <- data.frame(v1 = c("a","b","c","b"), v2 = c("b","d","e","a"))
df$key <- apply(df, 1, function(s) paste0(sort(s), collapse=''))
head(df)
##   v1 v2 key
## 1  a  b  ab
## 2  b  d  bd
## 3  c  e  ce
## 4  b  a  ab

Столбец $key должен теперь повторять повторы.

df %>% group_by(key) %>% do(head(., n = 1))
## Source: local data frame [3 x 3]
## Groups: key
##   v1 v2 key
## 1  a  b  ab
## 2  b  d  bd
## 3  c  e  ce
0
ответ дан r2evans 19 August 2018 в 09:08
поделиться
  • 1
    Это не очень хорошо используется dplyr. Я хотел бы предложить посмотреть distinct, если вы хотите пойти по этому маршруту. В небольшом (100 тыс. Строк) наборе данных этот подход в настоящее время принимает & gt; 4 секунды в моей системе, в то время как базовый R-подход занимает ~ 1,3 секунды, а метод data.table занимает ~ 0,03 секунды. – A5C1D2H2I1M1N2O1R2T1 18 February 2015 в 03:28
  • 2
    Использование pmin и pmax - это место, в которое входит скорость. Вариант ответа data.table в dplyr работает в ~ 0,05 секунды. Для справки вариант, который я имею в виду, выглядит следующим образом: data.frame(df, stringsAsFactors = FALSE) %>% mutate(key = paste0(pmin(X1, X2), pmax(X1, X2), sep = "")) %>% distinct(key) – A5C1D2H2I1M1N2O1R2T1 18 February 2015 в 03:32
  • 3
    Ваш код, безусловно, впечатляет. Я все еще изучаю все, что есть в dplyr, что должно показаться вам очевидным. – r2evans 18 February 2015 в 05:39
Другие вопросы по тегам:

Похожие вопросы: