将列添加到显示变量频率的数据框中

时间:2013-06-10 18:12:36

标签: r

在R中,总是让我感到困惑的小事。

说我有这样的数据框:

  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乘以~7mil数据集的10,000行子集。:

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 个答案:

答案 0 :(得分:7)

以下是ave的基本R方式。

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

答案 1 :(得分:6)

我确信有人会在短期内发布(丑陋;))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

答案 2 :(得分:2)

尝试使用列名中的破折号会非常痛苦。最好使用下划线或“点”。

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

我尝试在第一列没有ave时使用as.numeric,但令我惊讶的是收到了与因子级别相关的神秘错误消息。

答案 3 :(得分:1)

合并:

merge(data, data.frame(table(location = data$location)), by = c("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