给出样本数据框:
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
的对齐。
答案 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_longer
和pivot_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循环中变得更加容易。