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)、reshape2ggplot2.它们专门设计用于使许多此类数据操作比基础 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][]