rm(list = ls())                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
###############################input data new
data_1 <- iris
head(data_1)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
######################################
colnames(data_1)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"
str(data_1)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
data_1_ave <- aggregate(data_1[1:4], list(Species = data_1$Species), FUN = mean, na.rm = TRUE)
data_1_ave
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa        5.006       3.428        1.462       0.246
## 2 versicolor        5.936       2.770        4.260       1.326
## 3  virginica        6.588       2.974        5.552       2.026
data_1_sd <- aggregate(data_1[1:4], list(Species = data_1$Species), FUN = sd, na.rm = TRUE)
data_1_sd
##      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1     setosa    0.3524897   0.3790644    0.1736640   0.1053856
## 2 versicolor    0.5161711   0.3137983    0.4699110   0.1977527
## 3  virginica    0.6358796   0.3224966    0.5518947   0.2746501
colnames(data_1_sd)[2:5] <- paste0(colnames(data_1_sd[2:5]), "_sd")
data_1_sd
##      Species Sepal.Length_sd Sepal.Width_sd Petal.Length_sd Petal.Width_sd
## 1     setosa       0.3524897      0.3790644       0.1736640      0.1053856
## 2 versicolor       0.5161711      0.3137983       0.4699110      0.1977527
## 3  virginica       0.6358796      0.3224966       0.5518947      0.2746501
#####################################
data_2 <- merge(data_1_ave, data_1_sd, by = colnames(data_1_sd)[1])
data_2 <- data_2[, c(1,2,6)]
data_2
##      Species Sepal.Length Sepal.Length_sd
## 1     setosa        5.006       0.3524897
## 2 versicolor        5.936       0.5161711
## 3  virginica        6.588       0.6358796
#######################################################
data_2$Sepal.Length_merge <- paste(format(round(data_2$Sepal.Length,2),nsmall = 2),
                           format(round(data_2$Sepal.Length_sd,2),nsmall = 2),
                           sep = "\u00B1")
data_2
##      Species Sepal.Length Sepal.Length_sd Sepal.Length_merge
## 1     setosa        5.006       0.3524897          5.01±0.35
## 2 versicolor        5.936       0.5161711          5.94±0.52
## 3  virginica        6.588       0.6358796          6.59±0.64
dir_path <- getwd()
write.csv(data_2, paste0(dir_path,Sys.Date(),"-","iris_plus_minus_average_sd.csv"),row.names = FALSE)