Estou usando o código abaixo para gerar a média e o padrão da coluna numérica do dataframe da classe. Espero que os nomes das novas colunas sejam Age_mean, Age_std em vez de Age.Age_mean, Age.Age_std. não sei por que a Idade. é adicionalmente adicionado aos nomes das colunas
Aqui estão os dados e o código que usei
class <- structure(list(Name = c("Alfred", "Alice", "Barbara", "Carol",
"Henry", "James", "Jane", "Janet", "Jeffrey", "John", "Joyce",
"Judy", "Louise", "Mary", "Philip", "Robert", "Ronald", "Thomas",
"William"), Sex = c("M", "F", "F", "F", "M", "M", "F", "F", "M",
"M", "F", "F", "F", "F", "M", "M", "M", "M", "M"), Age = c(14,
13, 13, 14, 14, 12, 12, 15, 13, 12, 11, 14, 12, 15, 16, 12, 15,
11, 15), Height = c(69, 56.5, 65.3, 62.8, 63.5, 57.3, 59.8, 62.5,
62.5, 59, 51.3, 64.3, 56.3, 66.5, 72, 64.8, 67, 57.5, 66.5),
Weight = c(112.5, 84, 98, 102.5, 102.5, 83, 84.5, 112.5,
84, 99.5, 50.5, 90, 77, 112, 150, 128, 133, 85, 112)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -19L))
out1 <- list()
calc_mean <- function(data, vars, out) {
vars <- syms(vars)
print(vars)
for (v in vars){
print(v)
out1[[v]] <- data %>% summarise('{{v}}_mean' := mean(!! v), '{{v}}_std' := sd(!! v))
out2 <- data.frame(out1)
assign(out, out2, envir =.GlobalEnv)
}
return(out2)
}
calc_mean(data=class, vars=c('Age','Height'), out='want')
saída
Age.Age_mean Age.Age_std Height.Height_mean Height.Height_std
1 13.31579 1.492672 62.33684 5.127075
Eles provavelmente foram adicionados por causa dos valores vars ("Idade" e "Altura"). Uma maneira que sempre funciona é renomear a saída posteriormente, mas aqui está outra abordagem usando todos os verbos organizados sem
for
fazer loop usandoall_of
.saída
Observe que eu não nomearia a classe de dados, pois ela potencialmente entra em conflito com
class
Dados
Sua nomeação acontece aqui
'{{v}}_mean' := mean(!! v)
quando você atribui o nome e aquidata.frame(out1)
quando a lista de tibbles é lançada em um dataframe.Esta é uma saída intermediária após
data.frame(out1)
Isso é lançado em, por exemplo
Age.Age_mean
Você pode usar
summarise('mean' := mean(!! v), 'std' := sd(!! v))
para evitar nomes repetidos ou adicionarnames(out1) <- NULL
depoissummarize
para obter o resultado desejado com seu código.