Функция для выборки между дублированными значениями в data.frame
Итак, у меня есть объект data.frame под названием "DATA". Этот объект содержит один столбец с именем "Точка"(DATA$Point). Поскольку в этом конкретном столбце есть несколько дубликатов, я хотел бы построить функцию, которая будет выбирать только одну строку среди этих дубликатов в DATA.
Я пытался сделать это так:
sort.song<-function(DATA){
Point<-levels(DATA$Point)
DATA.NEW<-DATA[1:length(Point),]
#Ideally DATA.NEW should have an empty dataframe with nrow=length(Point) and the same columns
#as in DATA. But I THINK it will work (I don't know how to do the "ideally" way)
for(i in 1:dim(DATA)[1]){ #dim(DATA)[1] always bigger than length(Point)
SUBDATA<-DATA[which(DATA$Point%in%Point[i]),]
#I need to sample one row of the original data set only of the duplicates of the same value.
#So if there isn't a duplicate of one particular value, move on. Otherwise sample one between
#those duplicates.
l<-dim(SUBDATA)[1]
if (l==1){DATA.NEW[i,]<-SUBDATA[l,]}else{lc<-sample(1:l,1)}
DATA.NEW[i,]<-SUBDATA[lc,]
}
return(DATA.NEW)
}
test<-sort.song(DATA)
Но это не работает!:(Я получаю следующее сообщение об ошибке:
Error in `[<-.factor`(`*tmp*`, iseq, value = integer(0)) :
replacement has length zero
Это может быть глупый вопрос, но я вроде без вариантов здесь (всего R начинающий)
Любая помощь будет высоко оценена!!!!
3 ответа
Если вы хотите выбрать случайный дубликат, чтобы сохранить, а не duplicated
По умолчанию используется только сохранение первого, тогда почему бы не перемешать случайным образом весь набор данных, так что выбор первого в перетасованном наборе фактически является случайной строкой из оригинала:
DATAr <- DATA[sample(1:nrow(DATA),]
DATAr <- DATAr[!duplicated(DATAr$Point),]
Если заказ ваших оригинальных ДАННЫХ был несущественным, сохраните sample(...)
в переменной используйте это, чтобы изменить порядок данных и применить обратное, как только вы удалите дубликаты (или добавьте столбец DATA$ind <- 1:nrow(DATA)
и сортируйте свои данные, чтобы потом восстановить это.
R
имеет встроенные функции, sample
а также duplicated
, Таким образом, вы можете просто использовать
DATA[ sample( !duplicated(DATA$Point), N ), ]
# where `N` is the sample size you'd like.
в синтаксисе data.table приведенное выше
DATA[ sample( !duplicated(Point), N )]
Итак, вы хотите, чтобы каждая строка не дублировалась И первый экземпляр из тех, которые были продублированы, верно?
Тогда попробуйте это:
# build fake dataset
DATA <- as.data.frame(cbind(sample(c(1:10,3:7)),sample(1:15),sample(1:15)))
names(DATA) <- c("Point","some_col","some_other_col")
# check
print(DATA) # See Point has duplicate values
# your function
filter_data <- function(DATA){
distinct_points <- unique(DATA$Point)
as.data.frame(t(sapply(distinct_points, function(x){subset(DATA,Point == x)[1,]})))
}
#result
DATA.new <- filter_data(DATA)
print(DATA.new)