R很新。
我有一个简单的数据集,有两列:名称和长度。我的数据显示了一些有两次出现的名字。我如何平均这些长度,然后只列出1个名称与平均长度而不是2?谢谢。
答案 0 :(得分:10)
以下是几种方法:
- 与基地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
答案 1 :(得分:2)
如何使用线性拟合的原始解决方案!只有一行:
lm(length ~ name - 1, df)$coef
### namea nameb namec
### 5.0 8.5 7.0
答案 2 :(得分:1)
或使用data.table
(@Marat Talipov发布的数据)
library(data.table)
setDT(d)[, list(length=mean(length)), name][]
答案 3 :(得分:0)
绝对不是R方式或最佳方式,但你可以做到
library(sqldf)
df <- howeveryougetyourdata.csv
sqldf('SELECT AVG(length) average_length FROM df WHERE name IN ("this","that"))
答案 4 :(得分:0)
如果我理解正确,您需要计算每个名字的平均长度。我会像这样解决它。
library(plyr)
df.new <- ddply(df, .(name), summarise, length=mean(length))
鉴于您是R的新手,我建议您花些时间学习一些Hadley Wickham的软件包plyr
(或dplyr
),reshape2
和ggplot2
。它们专门设计用于使大量这些数据操作比基础R更直观。