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
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))
Utilisation .
dans dplyr.
library(dplyr)
mutate(df, IVMean = rowMeans(select(., starts_with("IV")), na.rm = TRUE))
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))
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))