Как определить имена столбцов, имеющих повторяющиеся значения в R - PullRequest
1 голос
/ 24 мая 2019

В кадре данных есть столбцы, состоящие из повторяющихся значений.Как мы можем определить имена столбцов, которые имеют повторяющиеся значения и их количество.

набор данных:

A  B  C
1  2  a
2  3  b
3  4  a
1  5  c

Мне нужен вывод, например,

столбцы с дублирующимися значениями являются A (2) и C (2)

Я попытался дублировать (), он возвращает вектор.

Ответы [ 3 ]

3 голосов
/ 24 мая 2019

Мы могли бы использовать sapply для циклического поиска столбцов, найти элементы duplicated и взять sum из них.

colSums(sapply(df, function(x) duplicated(x)|duplicated(x, fromLast = TRUE)))

#A B C 
#2 0 2 

Если вам нужен только ненулевой столбец, вы можете сделать

vals <- colSums(sapply(df, function(x) 
                duplicated(x)|duplicated(x, fromLast = TRUE)))
vals[vals!= 0]
#A C 
#2 2 

Используя dplyr, мы можем сделать то же самое с summarise_all

library(dplyr)
df %>%
  summarise_all(~sum(duplicated(.) | duplicated(., fromLast = TRUE))) %>%
  select_if(~. != 0)

#  A C
#1 2 2
1 голос
/ 24 мая 2019

Чтобы проверить наличие дублирующих значений в столбце, можно сравнить количество уникальных значений с количеством значений в столбце:

D <- read.table(header=TRUE, stringsAsFactors = FALSE, text=
"A  B  C
1  2  a
2  3  b
3  4  a
1  5  c")
names(D)[sapply(D, function(x) length(unique(x)))!=nrow(D)]

или

names(D)[sapply(D, function(x) any(duplicated(x)))]
0 голосов
/ 24 мая 2019

Мы можем перебрать столбцы и найти any дубликатов с table для идентификации имен столбцов

names(df1)[sapply(df1, function(x) any(table(x) > 1))]
#[1] "A" "C"

Или другое решение base R будет

names(Filter(anyDuplicated, df1))
#[1] "A" "C"

Или с tidyverse

library(tidyverse)
names(df1)[!!map_int(df1, anyDuplicated)]
#[1] "A" "C"

data

df1 <- structure(list(A = c(1L, 2L, 3L, 1L), B = 2:5, C = c("a", "b", 
   "a", "c")), class = "data.frame", row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...