Функция для выборки между дублированными значениями в 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)
Другие вопросы по тегам