2016-06-12 12 views
0

У меня есть кадр данных с 2600 элементами, которые распространяются на уровне 249 факторов (лиц). Набор данных не сбалансирован.R - вырезать данные из фрейма данных, чтобы сбалансировать его

enter image description here

Я хотел бы, чтобы удалить все записи, которые имеют менее 5 вхождения в один фактор. Также я хотел бы обрезать те, у которых более 5 вхождений до 5. Таким образом, в конце я хочу иметь фрейм данных с меньшим количеством записей, но который сбалансирован над человеком фактора.

Набор данных строится следующим образом:

file_list <- list.files("path/to/image/folder", full.names=TRUE) 
# the folder contains 2600 images, which include information about the 
# person factor in their file name 

file_names <- sapply(strsplit(file_list , split = '_'), "[", 1) 
person_list <- substr(file_names, 1 ,3) 
person_class <- as.factor(person_list) 

imageWidth = 320; # uniform pixel width of all images 
imageHeight = 280; # uniform pixel height of all images 
variableCount = imageHeight * imageWidth + 2 

images <- as.data.frame(matrix(seq(count),nrow=count,ncol=variableCount)) 
images[1] <- person_class 
images[2] <- eyepos_class 

for(i in 1:count) { 
    img <- readJPEG(file_list[i]) 
    image <- c(img) 
    images[i, 3:variableCount] <- image 
} 

enter image description here

Поэтому в основном мне нужно, чтобы получить количество выборок на уровне фактора (например, при использовании summary(images[1]), а затем выполнять операции обрезки данных . множество я не знаю, как начать здесь и любая помощь ценится

+0

Я знаю, что ваши данные не маленькая, но для того, чтобы написать хороший вопрос, который воспроизводимым, который получит вас upvotes и ответы, пожалуйста, включите воспроизводимый, что мы можем копировать и вставлять, чтобы воспроизвести ваши данные/проблему и воспроизвести вашу проблему. Вы можете использовать встроенный набор данных или создать свой собственный и включить код, который вы использовали. –

+0

Ну, я сделал все возможное, чтобы сделать его воспроизводимым, но все же потребуется набор данных, который доступен публично, но скорость загрузки медленная af – 4ndro1d

ответ

1

Возможность использования data.table

library(data.table) 
res <- setDT(images)[, if(.N > = 5) head(.SD, 5) , by = V1] 
+0

Кажется, что это работает (уменьшает набор данных с 2639 -> 1090 объектов). Благодаря! – 4ndro1d

+0

Возможно, вы можете сказать мне, почему «plot (res $ V1)» работает после этого, но 'plot (res [1])' дает ошибку: 'Ошибка в plot.new(): слишком большие поля? Разве это не должно быть так? – 4ndro1d

+1

@ 4ndro1d Подмножество столбцов в 'data.table' немного отличается' res $ V1' является вектором. Вы можете использовать 'res [[1]]', чтобы получить первый столбец как вектор – akrun

1

Использование dplyr:

library(dplyr) 
group_by(images, V1) %>% # group by the V1 column 
    filter(n() >= 5) %>% # keep only groups with 5 or more rows 
    slice(1:5)   # keep only the first 5 rows in each group 

Вы можете назначить результат объекту, как обычно. Например my_desired_result = group_by(images, ...

+0

Должен ли я присваивать результат некоторой переменной? Я попробовал, и никаких результатов я не получил. Ни кадр данных не изменился, ни я не могу что-то хранить в переменной. Но это похоже на то, что я ищу. – 4ndro1d

+0

Нужно obj_name <- –

+0

Я пробовал это без успеха – 4ndro1d

 Смежные вопросы

  • Нет связанных вопросов^_^