R 计算列子集上的行平均值

R 计算列子集上的行平均值,r,dataframe,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 类似于: RM<-row

给定一个示例数据帧:

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
类似于:

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

RM从数据框
DF
开始,您可以使用
数据。表
包:

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

从数据帧开始,您可以使用数据表包:

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

计算列子集上的行平均值:

创建一个新的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

计算列子集上的行平均值:

创建一个新的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

您可以在与平均值相对应的数据框中创建一个具有
$
的新行

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

DF$Mean您可以在与平均值对应的数据框中使用
$
创建新行

DF$Mean <- rowMeans(DF[,2:4])
DF$Mean使用dplyr:

使用dplyr:

(另一种解决方案是使用最新的
Tidyr
更新版本中的
pivot\u longer
pivot\u wide

您应该尝试使用pivot_longer将数据从宽到长的格式读取pivot_longer和pivot_longer上的最新tidyR更新()

库(tidyverse)
C1(另一种解决方案,使用最新的
Tidyr
更新中的
pivot\u longer
pivot\u wide

您应该尝试使用pivot_longer将数据从宽到长的格式读取pivot_longer和pivot_longer上的最新tidyR更新()

库(tidyverse)

C1
row意味着
很好,但如果您仍在试图了解
apply
函数族,这是一个开始理解它的好机会

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

DF['Mean']
rowMeans
很好,但如果您仍在试图了解
apply
函数系列,这是一个开始理解它的好机会

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

DF['Mean']谢谢。从
class(DF)
中还要注意,您不会丢失
data.frame
,因为任何查找
data.frame
对象的函数都应该在
setDT
之后接受
DF
(尤其是现在
data.table
已经成熟)如果我只想要C2和C3之间的行平均值呢?那么您可以使用
DF[,(mean=rowMeans(.SD)),by=ID,.SDcols=c(“C2”,“C3”)]
。参数
.SDcols
确定要包含在
.SD
中的列@user3841581@BenBarnes在我的例子中,我不确定我想要采用的实际列数,在某些情况下,它们可能是196列,而在其他情况下,它们可能是198列,以此类推。但有一个很常见的是他们名字的首字母,像Mgw.1,Mgw.2。。。Mgw.196类似的第1、2级。。。Hel.198所以我想做的是不要触摸data.table的最初5列,然后所有具有首字母Mgw的列,获取它们的rowMeans并将其分配给Mgw(删除所有单独的列,只保留一个具有平均值的列),等等,对于其余的列。你能告诉我怎么做吗?@新手这听起来像是个新问题,你应该自己发帖。谢谢。从
class(DF)
中还要注意,您不会丢失
data.frame
,因为任何查找
data.frame
对象的函数都应该在
setDT
之后接受
DF
(尤其是现在
data.table
已经成熟)如果我只想要C2和C3之间的行平均值呢?那么您可以使用
DF[,(mean=rowMeans(.SD)),by=ID,.SDcols=c(“C2”,“C3”)]
。参数
.SDcols
确定要包含在
.SD
中的列@user3841581@BenBarnes在我的例子中,我不确定我想要采用的实际列数,在某些情况下,它们可能是196列,而在其他情况下,它们可能是198列,以此类推。但有一个很常见的是他们名字的首字母,像Mgw.1,Mgw.2。。。Mgw.196类似的第1、2级。。。Hel.198所以我想做的是不要触摸data.table的最初5列,然后所有具有首字母Mgw的列,获取它们的rowMeans并将其分配给Mgw(删除所有单独的列,只保留一个具有平均值的列),等等,对于其余的列。你能告诉我怎么做吗?@Newbie这听起来像个新问题,你应该自己发布。你是说“新专栏”吗?你是说“新专栏”吗?
DF['Mean'] <- apply(DF[,2:4], 1, mean)