Уникальный на кадре данных только с выбранными столбцами
У меня есть dataframe s > 100 столбцами, и я бы нашел уникальные строки, сравнив только два столбца. Я надеюсь, что это непросто, но я не могу заставить его работать с unique
или duplicated
сам.
В ниже, я хотел бы уникально использовать только id и id2:
data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
id id2 somevalue
1 1 x
1 1 y
3 4 z
Я хотел бы получить либо:
id id2 somevalue
1 1 x
3 4 z
или
id id2 somevalue
1 1 y
3 4 z
(у меня нет предпочтения, какая из уникальных строк сохраняется)
Ответы
Ответ 1
Хорошо, если не важно, какое значение в выбранном столбце не дублируется, это должно быть довольно просто:
dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
> dat[!duplicated(dat[,c('id','id2')]),]
id id2 somevalue
1 1 1 x
3 3 4 z
Внутри вызова duplicated
я просто передаю только те столбцы из dat
, которые я не хочу дублировать. Этот код автоматически будет всегда выбирать первое из любых неоднозначных значений. (В этом случае x.)
Ответ 2
Использование unique()
:
dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
dat[row.names(unique(dat[,c("id", "id2")])),]
Ответ 3
Вот пара опций dplyr
, которые содержат недвойственные строки на основе идентификаторов столбцов id и id2:
library(dplyr)
df %>% distinct(id, id2, .keep_all = TRUE)
df %>% group_by(id, id2) %>% filter(row_number() == 1)
df %>% group_by(id, id2) %>% slice(1)
Ответ 4
Незначительное обновление в коде @Joran.
Используя приведенный ниже код, вы можете избежать двусмысленности и получить только два столбца:
dat <- data.frame(id=c(1,1,3), id2=c(1,1,4) ,somevalue=c("x","y","z"))
dat[row.names(unique(dat[,c("id", "id2")])), c("id", "id2")]