68

サンプルデータフレームが与えられた場合:

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列と各行の平均を含む2番目のデータフレームを作成するための最良の方法は何ですか?このようなもの:

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

似たようなもの:

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

手段を彼らのものと一致させておきたいID

4

6 に答える 6

62

列のサブセットの行平均を計算します。

DFの最初の列をIDという列として指定し、その行の他のすべてのフィールドの平均を計算して、「平均」というタイトルの列に配置する新しいdata.frameを作成します。

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
于 2012-06-08T12:06:27.787 に答える
28

データフレームから始めて、次のパッケージ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
于 2012-06-08T09:03:16.810 に答える
23

$Meansに対応するデータフレーム内に新しい行を作成できます

DF$Mean <- rowMeans(DF[,2:4])
于 2016-04-16T03:08:36.943 に答える
9

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
于 2018-05-15T14:59:40.757 に答える
0

(最新のpivot_longerアップデートを使用した別のソリューション)pivot_widerTidyr

ワイド形式からロング形式にデータを取得するには、pivot_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
于 2019-09-15T09:10:32.350 に答える
0

rowMeansいいのですが、それでもapply関数のファミリーに頭を悩ませようとしているのであれば、これはそれを理解し始める良い機会です。

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

最初の例とは少し異なる割り当てを行っていることに注意してください。このアプローチにより、forループへの組み込みが容易になります。

于 2020-10-12T19:42:44.797 に答える