R - 平均具有相同名称的行
R - Averaging rows that have the same name
对 R 很陌生
我有一个包含两列的简单数据集:名称和长度。我拥有的数据显示一些名字出现了两次。如何平均这些长度,然后只列出 1 个具有平均长度的名称而不是 2 个?谢谢。
绝对不是 R 方式或最佳方式,但你可以做到
library(sqldf)
df <- howeveryougetyourdata.csv
sqldf('SELECT AVG(length) average_length FROM df WHERE name IN ("this","that"))
这里有两种方法:
-基数 R:
aggregate(length~name,d,mean)
# name length
# 1 a 5.0
# 2 b 8.5
# 3 c 7.0
-有了dplyr
包(绝对值得花时间去探索)
library(dplyr)
d %>%
group_by(name) %>%
summarize(avg=mean(length))
# Source: local data frame [3 x 2]
#
# name avg
# 1 a 5.0
# 2 b 8.5
# 3 c 7.0
可以通过这些命令生成样本可重现数据集:
set.seed(1)
d <- data.frame(name=sample(letters[1:3],size=5,replace=TRUE),length=sample(10,size=5,replace=TRUE))
# name length
# 1 a 9
# 2 b 10
# 3 b 7
# 4 c 7
# 5 a 1
如果我没理解错的话,您是想计算每个名字的平均长度。我会这样处理。
library(plyr)
df.new <- ddply(df, .(name), summarise, length=mean(length))
鉴于您是 R 的新手,我鼓励您花时间学习 Hadley Wickham 的一些软件包 plyr
(或 dplyr
)、reshape2
和 ggplot2
.它们专门设计用于使许多此类数据操作比基础 R 更直观。
以及线性拟合的原始解决方案怎么样!仅一行:
lm(length ~ name - 1, df)$coef
### namea nameb namec
### 5.0 8.5 7.0
或使用 data.table
(来自@Marat Talipov 的 post 的数据)
library(data.table)
setDT(d)[, list(length=mean(length)), name][]
对 R 很陌生
我有一个包含两列的简单数据集:名称和长度。我拥有的数据显示一些名字出现了两次。如何平均这些长度,然后只列出 1 个具有平均长度的名称而不是 2 个?谢谢。
绝对不是 R 方式或最佳方式,但你可以做到
library(sqldf)
df <- howeveryougetyourdata.csv
sqldf('SELECT AVG(length) average_length FROM df WHERE name IN ("this","that"))
这里有两种方法:
-基数 R:
aggregate(length~name,d,mean)
# name length
# 1 a 5.0
# 2 b 8.5
# 3 c 7.0
-有了dplyr
包(绝对值得花时间去探索)
library(dplyr)
d %>%
group_by(name) %>%
summarize(avg=mean(length))
# Source: local data frame [3 x 2]
#
# name avg
# 1 a 5.0
# 2 b 8.5
# 3 c 7.0
可以通过这些命令生成样本可重现数据集:
set.seed(1)
d <- data.frame(name=sample(letters[1:3],size=5,replace=TRUE),length=sample(10,size=5,replace=TRUE))
# name length
# 1 a 9
# 2 b 10
# 3 b 7
# 4 c 7
# 5 a 1
如果我没理解错的话,您是想计算每个名字的平均长度。我会这样处理。
library(plyr)
df.new <- ddply(df, .(name), summarise, length=mean(length))
鉴于您是 R 的新手,我鼓励您花时间学习 Hadley Wickham 的一些软件包 plyr
(或 dplyr
)、reshape2
和 ggplot2
.它们专门设计用于使许多此类数据操作比基础 R 更直观。
以及线性拟合的原始解决方案怎么样!仅一行:
lm(length ~ name - 1, df)$coef
### namea nameb namec
### 5.0 8.5 7.0
或使用 data.table
(来自@Marat Talipov 的 post 的数据)
library(data.table)
setDT(d)[, list(length=mean(length)), name][]