Eu tenho R quadro de dados como este:
age group
1 23.0883 1
2 25.8344 1
3 29.4648 1
4 32.7858 2
5 33.6372 1
6 34.9350 1
7 35.2115 2
8 35.2115 2
9 35.2115 2
10 36.7803 1
...
Preciso obter o quadro de dados no seguinte formato:
group mean sd
1 34.5 5.6
2 32.3 4.2
...
O número do grupo pode variar, mas seus nomes e quantidades podem ser obtidos ligando para levels(factor(data$group))
Quais manipulações devem ser feitas com os dados para obter o resultado?
r
data-transformation
Yuriy Petrovskiy
fonte
fonte
aggregate
,tapply
e stackoverflow.com para quaisquer questões de codificação subsequentes deste tipo.Respostas:
Aqui está a variante plyr de uma linha usando o ddply :
Aqui está outra variante de uma linha usando o novo pacote data.table .
Este é mais rápido, embora seja perceptível apenas na tabela com 100 mil linhas. Tempos no meu Macbook Pro com processador Core 2 Duo de 2,53 Ghz e R 2.11.1:
Economias adicionais são possíveis se usarmos
setkey
:fonte
dt <- data.table(dtf)
vez dodt <- data.table(dt)
segundo bloco de código. Dessa forma, você está criando a tabela de dados a partir de um quadro de dados em vez dadt
função dostats
pacote. Tentei editá-lo, mas não consigo fazer edições com menos de seis caracteres.data.table
é a melhor maneira de agregar dados e essa resposta é ótima, mas ainda assim arranha a superfície. Além de sintaticamente superior, também é extremamente flexível e possui muitos recursos avançados que envolvem junções e mecânica interna. Confira as perguntas frequentes, a página do github ou o curso para obter mais informações.Uma possibilidade é usar a função agregada . Por exemplo,
fornece a segunda coluna do resultado desejado.
fonte
data.frame(group=levels(factor(data$group)),mean=(aggregate(data$age, by=list(data$group), FUN=mean)$x),sd=(aggregate(data$age, by=list(data$group), FUN=sd)$x))
mas eu não tenho certeza que é o caminho correto. Não tenho certeza do que acontecerá; os resultados das colunas vinculadas estarão em ordem diferente (acho que é possível). Qual é a sua opinião?aggregate()
:aggregate(age ~ group, data=dat, FUN = function(x) c(M=mean(x), SD=sd(x)))
Como você está manipulando um quadro de dados, o
dplyr
pacote é provavelmente a maneira mais rápida de fazê-lo.ou equivalente, usando o operador
dplyr
/magrittr
pipe:EDITAR pleno uso do operador de tubo:
fonte
dplyr
. Isso tornou muitas tarefas R simples e muitos desses métodos obsoletos.plyr
vez dedplyr
qual estava causando o problema.Ótimo, obrigado bquast por adicionar a solução dplyr!
Acontece que então, dplyr e data.table estão muito próximos:
data.table ainda é o mais rápido, seguido de perto por dplyr (), que curiosamente parece mais rápido no data.frame do que no data.table:
fonte
Além das sugestões existentes, você pode conferir a
describe.by
função nopsych
pacote.Ele fornece várias estatísticas descritivas, incluindo a média e o desvio padrão com base em uma variável de agrupamento.
fonte
Eu achei a função
summaryBy
no pacote doBy a mais conveniente para isso:fonte
Use o
sqldf
pacote. Isso permite que você agora use o SQL para resumir os dados. Depois de carregá-lo, você pode escrever algo como -fonte
Editado: de acordo com as sugestões de chl
A função que você está procurando é chamada "tapply", que aplica uma função por grupo especificado por um fator.
Eu realmente sugiro trabalhar com um tutorial básico de R, explicando todas as estruturas e métodos de dados mais usados. Caso contrário, você ficará preso a cada centímetro durante a programação. Consulte esta pergunta para obter uma coleção de recursos disponíveis gratuitos.
fonte
for
loop aqui, você pode construir o seu quadro de dados em linha, IMO. Para atapply
chamada, usefunction(x) c(mean(x),sd(x)))
ecbind
o resultado, pois o OP solicitou as duas estatísticas. Além disso, addply
partir do pacote plyr poderia fazer isso sem problemas.cbind("mean"=mperage,"stdev"=stperage) gives no 'group' column. Will be joining by
cbind (grupo = níveis (fator (dados $ grupo)), "mean" = mperage, "stdev" = stperage) `correto?Aqui está um exemplo com a função que
aggregates()
eu mesmo fiz há algum tempo:Fornece o seguinte resultado:
Talvez você possa obter o mesmo resultado a partir da função R split ():
Deixe-me voltar à saída da
aggregates
função. Você pode transformá-la em uma bela tabela usandoreshape()
,xtabs()
eftable()
:Isto dá:
Bonito, não é? Você pode exportar esta tabela para um pdf com a
textplot()
função dogplots
pacote.Veja aqui as soluções de outras pessoas.
fonte