#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 См. Обновленный ответ, чтобы заставить это работать для неравного количества уникальных значений.