向数据框中添加一列,显示变量的频率。

8

假设我有这样一个数据框:

  location   species
1  seattle   A
2  buffalo   C
3  seattle   D
4  newark    J
5  boston    Q

我希望在此数据框中添加一列,显示每个位置在数据集中出现的次数,结果如下所示:
  location   species    freq-loc
1  seattle   A          2           #there are 2 entries with location=seattle
2  buffalo   C          1           #there is 1 entry with location=buffalo
3  seattle   D          2
4  newark    J          1
5  boston    Q          1

我知道使用table(data$location)可以给我提供一个列联表。但我不知道如何将表中的每个值映射到数据框中相应的条目。有人能帮忙吗?
更新 非常感谢所有的帮助!只是出于兴趣,我进行了一项基准测试,以查看与彼此相比,合并、plyr和ave解决方案的运行情况。测试集是我的原始10 x ~700万数据集的10000行子集。
Unit: milliseconds
expr         min         lq     median        uq       max neval
MERGE 110.877337 111.989406 112.585420 113.51679 120.23588   100
PLYR   26.305645  27.080403  27.576580  27.87157  68.40763   100
AVE     2.994528   3.117255   3.179898   3.35834  10.02955   100
4个回答

10

这里是使用基本R语言和ave函数的方法。

transform(d, freq.loc = ave(seq(nrow(d)), location, FUN=length))

7

我相信很快会有人发布一个(丑陋的;)aveplyr解决方案,但这里是data.table的解决方案:

library(data.table)
dt = data.table(your_df)

dt[, `freq-loc` := .N, by = location]
# note: using `-quotes around your var name, because of the "-" in the name

3
使用基础表格,然后合并:
merge(data, data.frame(table(location = data$location)), by = "location")
# location species Freq
# 1   boston       Q    1
# 2  buffalo       C    1
# 3   newark       J    1
# 4  seattle       A    2
# 5  seattle       D    2

此外,我听到有人请求plyr
library(plyr)
join(data, data.frame(table(location = data$location)))
# Joining by: location
# location species Freq
# 1  seattle       A    2
# 2  buffalo       C    1
# 3  seattle       D    2
# 4   newark       J    1
# 5   boston       Q    1

我认为“正确”的plyr解决方案是:ddply(df, .(location), mutate, freq.loc = length(location)) - eddi
1
我所说的“正确”,至少在plyr框架下,是指“概念上正确”,而不是更快。我不能说我关心它们的速度,因为我坚定地站在“data.table做得更好”的阵营里,但如果你感兴趣,那么你应该去做并发布结果。如果你这样做,最好使用像microbenchmark这样的基准测试包。 - eddi

2

尝试在列名称中使用破折号会非常麻烦。最好使用下划线或“点”。

dfrm$freq_loc <- ave( as.numeric(dat[[1]]), dat[["location"]] ,
                                                     FUN=length)

我尝试在第一列使用ave而没有使用as.numeric,但出乎意料地收到了与因子水平相关的神秘错误消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接