简体   繁体   中英

How to mutate a mean of certain rows in a data frame

I would like to create a new column which equals to the mean of several variables (columns) in my data frame. However, I'm afraid I can't use 'rowMeans' because I don't want to average all variables. Moreover, I'm hesitate to manually type all the variable names (which are many). For example:

my_data <- data.frame(a = c(1,2,3), b = c(4,5,6), c = c(10,10,10), d = c(13,24,81),
                      e = c(10, 8, 6), hello = c(1,-1,1), bye = c(1,5,5))

I want to mutate a row called avg which is the average of variables a, b, c, d, and e only. Because in my dataset, the variables names are long (and complex), and there are more than 10 variables, I prefer not to type them out one by one. So I guess I might need to use dplyr package and the mutate function?? Could you please suggest a clever way for me to do that?

The below content is added after your kind comments and answers suggest. Thank you all again:

Actually, the column names that I needed are Mcheck5_1_1, Mcheck5_2_1, ..., Mcheck5_8_1 (so there are 8 in total).However, I tried my_data$avg = rowMeans(select(my_data, Mcheck5_1_1:Mcheck5_8_1), na.rm = TRUE) but an error was thrown to me:

Error in select(my_data, Mcheck5_1_1:Mcheck5_8_1) : 
unused argument (Mcheck5_1_1:Mcheck5_8_1)

Right now I solved the problem by using the following code:

`idx = grep("Mcheck5_1_1", names(my_data))
my_data$avg = rowMeans(my_data[, idx:idx+7], na.rm = TRUE)`

But is there a more elegant way to do it? Or why couldn't I use select() ? Thanks!

I would do something like this

my_data <- data.frame(a = c(1,2,3), b = c(4,5,6), c = c(10,10,10), d = c(13,24,81),
                      e = c(10, 8, 6), hello = c(1,-1,1), bye = c(1,5,5))

several_variables <- c('a', 'b', 'c', 'd', 'e') #3 or `letters[1:5]`
my_data$avg <- rowMeans(my_data[,several_variables])
my_data
#>   a b  c  d  e hello bye  avg
#> 1 1 4 10 13 10     1   1  7.6
#> 2 2 5 10 24  8    -1   5  9.8
#> 3 3 6 10 81  6     1   5 21.2

Obviously, if the variables is at some fixed position, and you know they will stay there, you could use the numbered indexing as suggested by Jaap ,

my_data$avg <- rowMeans(my_data[,1:5])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM