计算列子集上的行均值

时间:2012-06-08 08:49:24

标签: r dataframe

给出样本数据框:

C1<-c(3,2,4,4,5)
C2<-c(3,7,3,4,5)
C3<-c(5,4,3,6,3)
DF<-data.frame(ID=c("A","B","C","D","E"),C1=C1,C2=C2,C3=C3)

DF
    ID C1 C2 C3
  1  A  3  3  5
  2  B  2  7  4
  3  C  4  3  3
  4  D  4  4  6
  5  E  5  5  3

创建包含ID列和每行平均值的第二个数据框的最佳方法是什么?像这样:

ID  Mean
A    3.66
B    4.33
C    3.33
D    4.66
E    4.33

类似于:

RM<-rowMeans(DF[,2:4])

我想保持手段与ID的对齐。

6 个答案:

答案 0 :(得分:45)

计算列子集的行意味着:

创建一个新的data.frame,它将DF中的第一列指定为名为ID的列,并计算该行上所有其他字段的平均值,并将其放入名为“Means”的列中:

data.frame(ID=DF[,1], Means=rowMeans(DF[,-1]))
  ID    Means
1  A 3.666667
2  B 4.333333
3  C 3.333333
4  D 4.666667
5  E 4.333333

答案 1 :(得分:25)

从数据框DF开始,您可以使用data.table包:

library(data.table)

## EDIT: As suggested by @MichaelChirico, setDT converts a
## data.frame to a data.table by reference and is preferred
## if you don't mind losing the data.frame
setDT(DF)

# EDIT: To get the column name 'Mean':

DF[, .(Mean = rowMeans(.SD)), by = ID]

#      ID     Mean
# [1,]  A 3.666667
# [2,]  B 4.333333
# [3,]  C 3.333333
# [4,]  D 4.666667
# [5,]  E 4.333333

答案 2 :(得分:13)

您可以在与“手段”

对应的数据框中创建一个$的新行
DF$Mean <- rowMeans(DF[,2:4])

答案 3 :(得分:3)

使用 dplyr

library(dplyr)

# exclude ID column then get mean
DF %>%
  transmute(ID,
            Mean = rowMeans(select(., -ID)))

或者

# select the columns to include in mean
DF %>%
  transmute(ID,
            Mean = rowMeans(select(., C1:C3)))

#   ID     Mean
# 1  A 3.666667
# 2  B 4.333333
# 3  C 3.333333
# 4  D 4.666667
# 5  E 4.333333

答案 4 :(得分:1)

(另一种使用pivot_longerpivot_wider来自最新Tidyr更新的解决方案)

您应该尝试使用ivot_longer来将数据从宽格式转换为长格式。在pivot_longer和pivot_wider(https://tidyr.tidyverse.org/articles/pivot.html)上阅读最新的tidyR更新

library(tidyverse)
C1<-c(3,2,4,4,5)
C2<-c(3,7,3,4,5)
C3<-c(5,4,3,6,3)
DF<-data.frame(ID=c("A","B","C","D","E"),C1=C1,C2=C2,C3=C3)

此处输出

  ID     mean
  <fct> <dbl>
1 A      3.67
2 B      4.33
3 C      3.33
4 D      4.67
5 E      4.33

答案 5 :(得分:0)

rowMeans很不错,但是如果您仍然想绕着apply函数家族,这是开始理解它的好机会。

DF['Mean'] <- apply(DF[,2:4], 1, mean)

注意,我所做的作业与第一个示例略有不同。这种方法使将其合并到for循环中变得更加容易。