У меня проблема с агрегацией, которую я не могу понять, как эффективно работать в R.
Скажем, у меня есть следующие данные:
group1 <- c("a","b","a","a","b","c","c","c","c",
"c","a","a","a","b","b","b","b")
group2 <- c(1,2,3,4,1,3,5,6,5,4,1,2,3,4,3,2,1)
value <- c("apple","pear","orange","apple",
"banana","durian","lemon","lime",
"raspberry","durian","peach","nectarine",
"banana","lemon","guava","blackberry","grape")
df <- data.frame(group1,group2,value)
Я заинтересован в выборке из данныхкадр df
такой, что я случайным образом выбираю только одну строку из каждой комбинации факторов group1
и group2
.
Как видите, результаты table(df$group1,df$group2)
1 2 3 4 5 6
a 2 1 2 1 0 0
b 2 2 1 1 0 0
c 0 0 1 1 2 1
показывает, что некоторые комбинации видны более одного раза, а другие никогда не видны.Для тех, которые видны более одного раза (например, group1="a"
и group2=3
), я хочу выбрать случайным образом только одну из соответствующих строк и вернуть новый фрейм данных, который имеет только это подмножество строк.Таким образом, каждая возможная комбинация группирующих факторов представлена только одной строкой во фрейме данных.
Один важный аспект здесь заключается в том, что мои фактические наборы данных могут содержать от 500 000 строк до> 2 000 000 строк, поэтомуважно помнить о производительности.
Я относительно новичок в R, поэтому мне было трудно понять, как правильно сгенерировать эту структуру.Одна попытка выглядела так (с использованием пакета plyr
):
choice <- function(x,label) {
cbind(x[sample(1:nrow(x),1),],data.frame(state=label))
}
df <- ddply(df[,c("group1","group2","value")],
.(group1,group2),
pick_junc,
label="test")
Обратите внимание, что в этом случае я также добавляю дополнительный столбец к фрейму данных, называемый «метка», который указывается как дополнительныйаргумент функции ddply
.Однако я убил это примерно через 20 минут.
В других случаях я пытался использовать aggregate
или by
или tapply
, но я никогда не знаю точно, что получает указанная функция, что онадолжен вернуться, или что делать с результатом (особенно для by
).
Я пытаюсь переключиться с Python на R для исследовательского анализа данных, но этот тип агрегации имеет решающее значение для меня.В Python я могу выполнять эти операции очень быстро, но это неудобно, так как мне приходится генерировать отдельную структуру сценария / данных для каждого отдельного типа агрегации, которую я хочу выполнить.
Я хочу любить R, поэтомупожалуйста помоги!Спасибо!
Ури