[英]average between duplicated rows in R
我有一個數據框df
,其中的行與名稱列重復,但與值列不重復:
name value etc1 etc2
A 9 1 X
A 10 1 X
A 11 1 X
B 2 1 Y
C 40 1 Y
C 50 1 Y
我需要將重復的名稱聚合到一行中,同時計算值列的平均值。 預期的output如下:
name value etc1 etc2
A 10 1 X
B 2 1 Y
C 45 1 Y
我曾嘗試使用df[duplicated(df$name),]
但當然這並沒有給我重復項的平均值。 我想使用aggregate()
,但問題是這個 function 的 FUN 部分也適用於所有其他列,除其他問題外,它無法計算字符內容。 由於所有其他列在“重復項”上都具有相同的內容,因此我需要將它們聚合在一起,就像名稱列一樣。 任何提示...?
這是一個data.table
解決方案。 解決方案是通用的,即使對於具有60列的data.frame也是如此。 因為我按所有不同值的變量對數據進行分組(請參閱下面的創建鍵)
library(data.table)
dat <- read.table(text='name value etc1 etc2
A 9 1 X
A 10 1 X
A 11 1 X
B 2 1 Y
C 40 1 Y
C 50 1 Y',header=TRUE)
keys <- colnames(dat)[!grepl('value',colnames(dat))]
X <- as.data.table(dat)
X[,list(mm= mean(value)),keys]
name etc1 etc2 mm
1: A 1 X 10
2: B 1 Y 2
3: C 1 Y 45
編輯擴展到多個值變量
如果您有多個要計算平均值的數值變量,例如,如果您的數據看起來像這樣
name value etc1 etc2 value1
1 A 9 1 X 2.1763485
2 A 10 1 X -0.7954326
3 A 11 1 X -0.5839844
4 B 2 1 Y -0.5188709
5 C 40 1 Y -0.8300233
6 C 50 1 Y -0.7787496
上述解決方案可以像這樣擴展:
X[,lapply(.SD,mean),keys]
name etc1 etc2 value value1
1: A 1 X 10 0.2656438
2: B 1 Y 2 -0.5188709
3: C 1 Y 45 -0.8043865
這將計算鍵列表中不存在的所有變量的均值。
您可以使用如下aggregate()
函數:
aggregate(df$value,by=list(name=df$name,etc1=df$etc1,etc2=df$etc2),data=df,FUN=mean)
代碼(由Metrics編寫)幾乎可以工作,除了在一個地方(.name)。 我稍微修改了一下:
sample<- structure(list(name = structure(c(1L, 1L, 1L, 2L, 3L, 3L), .Label = c("A",
"B", "C"), class = "factor"), value = c(9L, 10L, 11L, 2L, 40L,
50L), etc1 = c(1L, 1L, 1L, 1L, 1L, 1L), etc2 = structure(c(1L,
1L, 1L, 2L, 2L, 2L), .Label = c("X", "Y"), class = "factor")), .Names = c("name",
"value", "etc1", "etc2"), class = "data.frame", row.names = c(NA,
-6L))
sample.m <- ddply(sample, 'name', summarize, value =mean(value), etc1=head(etc1,1), etc2=head(etc2,1))
sample.m
name value etc1 etc2
1 A 10 1 X
2 B 2 1 Y
3 C 45 1 Y
假設您的數據幀是df。
install.packages("plyr")
library(plyr)
df<- structure(list(name = structure(c(1L, 1L, 1L, 2L, 3L, 3L), .Label = c("A",
"B", "C"), class = "factor"), value = c(9L, 10L, 11L, 2L, 40L,
50L), etc1 = c(1L, 1L, 1L, 1L, 1L, 1L), etc2 = structure(c(1L,
1L, 1L, 2L, 2L, 2L), .Label = c("X", "Y"), class = "factor")), .Names = c("name",
"value", "etc1", "etc2"), class = "data.frame", row.names = c(NA,
-6L))
df.m<-ddply(df,.(name),summarize, value=mean(value),etc1=head(etc1,1),etc2=head(etc2,1))
df.m
name value etc1 etc2
1 A 10 1 X
2 B 2 1 Y
3 C 45 1 Y
這個簡單的對我有用:
avg_data <- aggregate(. ~ name, df, mean)
使用“聚合”function:基於命名變量(“名稱”),在數據框“df”中對所有變量(.)應用公式方法(x~y),以執行“平均”function。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.