web-dev-qa-db-fra.com

Dplyr - Moyenne pour plusieurs colonnes

Je veux calculer la moyenne de plusieurs colonnes, en créant une nouvelle colonne, en utilisant dplyr et sans fusion + fusion.

> head(growth2)
  CODE_COUNTRY CODE_PLOT IV12_ha_yr IV23_ha_yr IV34_ha_yr IV14_ha_yr IV24_ha_yr IV13_ha_yr
1            1         6       4.10       6.97         NA         NA         NA       4.58
2            1        17       9.88       8.75         NA         NA         NA       8.25
3            1        30         NA         NA         NA         NA         NA         NA
4            1        37      15.43      15.07      11.89      10.00      12.09      14.33
5            1        41      20.21      15.01      14.72      11.31      13.27      17.09
6            1        46      12.64      14.36      13.65       9.07      12.47      12.36
> 

J'ai besoin d'une nouvelle colonne dans l'ensemble de données avec la moyenne de toutes les colonnes IV. J'ai essayé ceci:

growth2 %>% 
  group_by(CODE_COUNTRY, CODE_PLOT) %>%
  summarise(IVmean=mean(IV12_ha_yr:IV13_ha_yr, na.rm=TRUE))

Et renvoyé plusieurs erreurs en fonction de l'exemple utilisé, telles que:

Error in NA_real_:NA_real_ : NA/NaN argument

ou

Error in if (trim > 0 && n) { : missing value where TRUE/FALSE needed
16
fede_luppi

Vous n'avez pas besoin de grouper, juste select() puis mutate()

library(dplyr)
mutate(df, IVMean = rowMeans(select(df, starts_with("IV")), na.rm = TRUE))
22
Rich Scriven

Utilisation . dans dplyr.

library(dplyr)
mutate(df, IVMean = rowMeans(select(., starts_with("IV")), na.rm = TRUE))
3
Shixiang Wang

vous pouvez utiliser comme suit:

vos données

data<- structure(list(CODE_COUNTRY = c(1L, 1L, 1L, 1L, 1L, 1L), CODE_PLOT = c(6L, 
17L, 30L, 37L, 41L, 46L), IV12_ha_yr = c(4.1, 9.88, NA, 15.43, 
20.21, 12.64), IV23_ha_yr = c(6.97, 8.75, NA, 15.07, 15.01, 14.36
), IV34_ha_yr = c(NA, NA, NA, 11.89, 14.72, 13.65), IV14_ha_yr = c(NA, 
NA, NA, 10, 11.31, 9.07), IV24_ha_yr = c(NA, NA, NA, 12.09, 13.27, 
12.47), IV13_ha_yr = c(4.58, 8.25, NA, 14.33, 17.09, 12.36)), .Names = c("CODE_COUNTRY", 
"CODE_PLOT", "IV12_ha_yr", "IV23_ha_yr", "IV34_ha_yr", "IV14_ha_yr", 
"IV24_ha_yr", "IV13_ha_yr"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))

mydata <- cbind(data,IVMean=apply(data[,3:8],1,mean, na.rm=TRUE))

vous pouvez aussi faire ça

 mydata <- cbind(data,IVMean=rowMeans(data[3:8], na.rm=TRUE))
0
user1267127

J'ai essayé de commenter la réponse de Rick Scriven mais je n'ai pas les points d'expérience pour cela. Quoi qu'il en soit, je voulais contribuer. Sa réponse a dit de faire ceci:

    library(dplyr)
    mutate(df, IVMean = rowMeans(select(df, starts_with("IV")), na.rm = TRUE))

Cela fonctionne, mais si toutes les colonnes ne commencent pas par "IV", ce qui était mon cas, comment procédez-vous? Il s'avère que cette sélection ne veut pas de vecteur logique, vous ne pouvez donc pas utiliser AND ou OR. Par exemple, vous ne pouvez pas dire "démarre_avec ('X') | démarre_avec ('Y')". Vous devez construire un vecteur numérique. Voici comment procéder.

    mutate(df, IVMean = rowMeans(select(df, c(starts_with("IV"), starts_with("IX"))), na.rm = TRUE))
0
Jeff