在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
答案 0 :(得分:7)
以下是ave
的基本R方式。
transform(d, freq.loc = ave(seq(nrow(d)), location, FUN=length))
答案 1 :(得分:6)
我确信有人会在短期内发布(丑陋;))ave
或plyr
解决方案,但这里是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