2014-11-20 5 views
0

У меня есть кадр данных, называемый subdata, с размером 10299 x 81. Столбец 1 называется «Тема» и столбец 2, называемый «Activity». Я хочу рассчитать среднее значение для каждого столбца, сгруппированного по «Subject» и «Activity».Функция R применяется к кадру данных, сгруппированному по нескольким факторам

Вот функции, которые я пробовал, и ни один из них не работает до сих пор. В конце концов я использовал функцию colwise (mean), кажется, работает. Я новичок в R и только что узнал sapply, lapply, tapply функции и кажется, что функция работает в столбцах.

Может ли кто-нибудь помочь мне объяснить, что означает это сообщение об ошибке или предупреждении, и если есть способ заставить эти функции работать?

Использование lapply функции:

newdata<- subdata[, lapply(.SD, mean), by = c("Subject","Activity")] 

Сообщение об ошибке:

Error in `[.data.frame`(subdata, , lapply(.SD, mean), by = c("Subject", : 
unused argument (by = c("Subject", "Activity")) 

Использование функцией:

newdata<-by(subdata, list(subdata$Subject, subdata$Activity), mean) 

я получил предупреждение:

Warning messages: 
1: In mean.default(data[x, , drop = FALSE], ...) : 
    argument is not numeric or logical: returning NA 

Затем я попытался ddply в пакете plyr

ddply(subdata, .(Subject, Activity), mean) 

Я получил такое же предупреждение:

Warning messages: 
1: In mean.default(piece, ...) : argument is not numeric or logical: returning NA 0 

Наконец я colwise (средняя) функция, она, кажется, работает

newdata<-ddply(subdata, .(Subject, Activity), colwise(mean)) 
+0

с вашей последней опцией, попробуйте 'numcolwise (mean)' вместо 'colwise (mean)' – cdeterman

ответ

1

Трудно быть уверенным в представительной выборке вашего набора данных. Давайте создадим некоторые данные для работы.

# Create some random demo data 
subdata <- data.frame(Subject = rep(seq(5), each=4), 
        Activity = rep(LETTERS[1:2], 10), v1=rnorm(20), v2=rnorm(20)) 

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

Ваш by заявление представляет собой ошибку в отношении нечисловых данных. Это связано с тем, что функция by не настолько умна. Вам нужно предоставить только столбцы для анализа, а затем индексы (т. Е. Столбцы факторов).

by(subdata[,-c(1,2)], list(subdata$Subject, subdata$Activity), function(x) colMeans(x)) 

Althought вы, вероятно, хотите rbind этот вывод и переназначить rownames соответствовать группам. Однако для этой цели лучше всего использовать что-то aggregate, чтобы избежать таких дополнительных вычислений.

aggregate(subdata[,-c(1,2)], list(subdata$Subject, subdata$Activity), mean) 

ddply Ваших заявлений близки, но, как я предложил выше, вы должны использовать numcolwise резюмировать над вашими numeric столбцов.

library(plyr) 
# summarize over all numeric columns 
ddply(subdata, .(Subject, Activity), numcolwise(mean)) 
Смежные вопросы