Поиск только уникального значения в каждом столбце в d

#r

#r

Вопрос:

У меня есть приведенный ниже фрейм данных df1. (Отредактировано, чтобы иметь разное количество повторяющихся значений во фрейме данных.)

 > dput(df1)
structure(list(...1 = c("a", "b", "c", "d", "e"), x = c(5, 10, 
20, 20, 25), y = c(2, 6, 6, 6, 10), z = c(6, 2, 1, 8, 1)), row.names = c(NA, 
-5L), class = c("tbl_df", "tbl", "data.frame"))

  >df1
            x     y     z 
  a         5     2     6
  b        10     6     2
  c        20     6     1
  d        20     6     8
  e        25    10     1
 

Я хотел бы получить df2, который имеет только уникальные значения из каждого столбца ‘x’, ‘y’ и ‘z’.
Я пытался:

 df2<-apply(df1,2, unique)
df2 <- do.call(cbind, df2)
df2 <- as.data.frame(df2)
 

Желаемый результат:

       >df2
        x     y     z 
        5     2     6
       10     6     2
       20     10    1
       25           8
 

Комментарии:

1. Как упоминалось в комментариях, что делать, если каждый столбец имеет разное количество уникальных значений? Пожалуйста, приведите пример и укажите, чего вы ожидаете.

Ответ №1:

У Tibbles не может быть имен строк, поэтому он создает новый столбец с ним в ваших данных. Вы можете удалить первый столбец, а затем использовать unique для всех столбцов.

 library(dplyr)
df1$...1 <- NULL
df1 %>% summarise(across(.fns = unique))

#     x     y     z
#  <dbl> <dbl> <dbl>
#1     5     2     6
#2    10     6     2
#3    20     8     1
#4    25    10     8
 

Или в базовом R :

 df2 <- data.frame(sapply(df1, unique))
 

Для неравных уникальных значений в столбце вы могли бы использовать :

 tmp <- lapply(df1, unique)
data.frame(sapply(tmp, `[`, 1:max(lengths(tmp))))

#   x  y z
#1  5  2 6
#2 10  6 2
#3 20 10 1
#4 25 NA 8
 

Комментарии:

1. Возможно, стоит упомянуть, что, хотя это работает для данных выборки данных, оно зависит от наличия равного количества дубликатов в каждом столбце. В противном случае он попытается (и потерпит неудачу) создать df с разной длиной столбцов, и вам нужно будет использовать другую структуру данных.

2. Когда у меня разное количество повторяющихся значений в столбце, значение, похоже, повторяется снова. Есть ли способ преодолеть это?

3. @kaix См. Обновленный ответ, чтобы заставить это работать для неравного количества уникальных значений.