在R中查找多个列的平均值

3

我的数据集长这样:

values<-c(9,8,NA,8)
acceptance<-c(8,8,NA,6)
diffusion<-c(9,8,7,NA)
attitudes<-c(7,7,6,NA)
df<-data.frame(values,acceptance,diffusion,attitudes)

values  acceptance  diffusion  attitudes

  9         8          6           8 
  8         8          8           7
  NA        NA         7           6
  8         6          NA          NA

我可以使用代码mean(df$values, na.rm = T)获取每列的平均值,但我想为特定列(例如:values和acceptance)创建一个新变量来计算总平均值。我可以只是对每个要包括的列使用相同的代码,然后以此方式计算平均值:

mean(df$values, na.rm = T) = 8.333
mean(df$acceptance, na.rm = T) = 7.333
(8.333 + 7.333)/2 = 7.833
df$values_acceptance<-7.833

但这样做效率很低,因为我需要包括多个变量。我相信有更简单的方法可以做到这一点,但我还在逐渐熟悉R。

提前感谢!


df$values_acceptance <- mean( unlist( df[c("values","acceptance")] ), na.tm =TRUE) 这将被循环利用到df中的行数,而不管行中是否有任何NAs。 - IRTFM
4个回答

2
我们可以在选定的列上使用colMeans,并得到它们的mean,然后将输出分配给创建新列(不需要任何包)。
df$values_acceptance<- mean(colMeans(df[c('values', 'acceptance')], na.rm = TRUE))

-输出

> df
  values acceptance diffusion attitudes values_acceptance
1      9          8         9         7          7.833333
2      8          8         8         7          7.833333
3     NA         NA         7         6          7.833333
4      8          6        NA        NA          7.833333

如果我们需要使用dplyr

library(dplyr)
df %>%
    mutate(values_acceptance = mean(unlist(across(c(values,
         acceptance), mean, na.rm = TRUE))))

-输出

values acceptance diffusion attitudes values_acceptance
1      9          8         9         7          7.833333
2      8          8         8         7          7.833333
3     NA         NA         7         6          7.833333
4      8          6        NA        NA          7.833333

如果你有很多列,你也可以通过索引引用你感兴趣的列,例如 df %>% mutate(values_acceptance_diffusion = mean(unlist(across(c(1:3), mean, na.rm = TRUE)))) 或者 df %>% mutate(values_acceptance_diffusion = mean(unlist(across(c(1,2,3), mean, na.rm = TRUE)))) - jared_mamrot

1

只需使用 c() 来组合您想要计算总均值的列:

df %>% mutate(new=mean(c(values,acceptance),na.rm = T))
  values acceptance diffusion attitudes      new
1      9          8         9         7 7.833333
2      8          8         8         7 7.833333
3     NA         NA         7         6 7.833333
4      8          6        NA        NA 7.833333

0

你可以这样处理

df %>%
  select(values, acceptance) %>%
  reshape2::melt() %>%
  summarise(n = mean(value, na.rm = TRUE))

结果就像这样

         n
1 7.833333

0
你可以使用mapply。
df2 <- mapply(mean,df,na.rm=T)


这将产生

   values acceptance  diffusion  attitudes 
  8.333333   7.333333   8.000000   6.666667 

或者如果你想要计算每列的平均值,你可以这样操作

mean(mapply(mean,df,na.rm=T))

[1] 7.583333

如果您需要指定特定的列,可以按照以下方式操作。
mean(mapply(mean,df[c(1:2)],na.rm=T))

[1] 7.833333

如果其中一列的含义是NA,则使用na.rm两次

mean(mapply(mean,df[c(1:2)],na.rm=T),na.rm=T)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接