web-dev-qa-db-fra.com

Calculer les moyennes des lignes sur un sous-ensemble de colonnes

À 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.

47
Vinterwoo

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
46
Jilber Urbina

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
26
BenBarnes

Vous pouvez créer une nouvelle ligne avec $ dans votre cadre de données correspondant aux Moyens

DF$Mean <- rowMeans(DF[,2:4])
14
Nadegelia

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
4
zx8754