À partir d'un exemple de cadre de données:
C1<-c(3,2,4,4,5)
C2<-c(3,7,3,4,5)
C3<-c(5,4,3,6,3)
DF<-data.frame(ID=c("A","B","C","D","E"),C1=C1,C2=C2,C3=C3)
DF
ID C1 C2 C3
1 A 3 3 5
2 B 2 7 4
3 C 4 3 3
4 D 4 4 6
5 E 5 5 3
Quel est le meilleur moyen de créer un deuxième cadre de données contenant la colonne ID
et la moyenne de chaque ligne? Quelque chose comme ça:
ID Mean
A 3.66
B 4.33
C 3.33
D 4.66
E 4.33
Quelque chose de semblable à:
RM<-rowMeans(DF[,2:4])
Je voudrais garder les moyens alignés avec leurs ID
.
Calculer la moyenne des lignes sur un sous-ensemble de colonnes:
Créez un nouveau data.frame qui spécifie la première colonne de DF) en tant que colonne appelée ID, calcule la moyenne de tous les autres champs de cette ligne et la place dans la colonne "Moyens":
data.frame(ID=DF[,1], Means=rowMeans(DF[,-1]))
ID Means
1 A 3.666667
2 B 4.333333
3 C 3.333333
4 D 4.666667
5 E 4.333333
En commençant par votre bloc de données DF
, vous pouvez utiliser le data.table
paquet:
library(data.table)
## EDIT: As suggested by @MichaelChirico, setDT converts a
## data.frame to a data.table by reference and is preferred
## if you don't mind losing the data.frame
setDT(DF)
# EDIT: To get the column name 'Mean':
DF[, .(Mean = rowMeans(.SD)), by = ID]
# ID Mean
# [1,] A 3.666667
# [2,] B 4.333333
# [3,] C 3.333333
# [4,] D 4.666667
# [5,] E 4.333333
Vous pouvez créer une nouvelle ligne avec $
dans votre cadre de données correspondant aux Moyens
DF$Mean <- rowMeans(DF[,2:4])
Utiliser dplyr:
library(dplyr)
# exclude ID column then get mean
DF %>%
transmute(ID,
Mean = rowMeans(select(., -ID)))
Ou
# select the columns to include in mean
DF %>%
transmute(ID,
Mean = rowMeans(select(., C1:C3)))
# ID Mean
# 1 A 3.666667
# 2 B 4.333333
# 3 C 3.333333
# 4 D 4.666667
# 5 E 4.333333