假设我的数据如下:
df
ID Location
1 54
2 35
3 54
4 35
5 71
我有兴趣查找指定位置的访问频率,然后根据“位置”列中的值将该频率(即总和)分配给新列。
首先,我尝试使用table
函数:
count<-as.data.frame(table(df))
count
var1 freq
54 2
35 2
71 1
从这里开始,我想在df中创建一个名为count的新列,例如,为每个ID分配freq = 2,对应于Location = 54。即,df现在看起来像这样:
df
ID Location count
1 54 2
2 35 2
3 54 2
4 35 2
5 71 1
我的真实数据包含太多的位置值,我可以写一个ifelse语句来有条件地分配这些计数值。我不确定如何以有效的方式完成(我也可以创建一个空列并在dplyr中使用replace
函数,但这同样费力。任何提示?
谢谢!
答案 0 :(得分:3)
我们可以使用add_count
中的dplyr
(在devel版本中 - 很快就会发布0.6.0)
library(dplyr)
df %>%
add_count(Location)
# A tibble: 5 × 3
# ID Location n
# <int> <int> <int>
#1 1 54 2
#2 2 35 2
#3 3 54 2
#4 4 35 2
#5 5 71 1
但如果我们想从table
输出中执行此操作,我们可以使用merge
merge(df, as.data.frame(table(df$Location)), by.x= "Location", by.y = "Var1")
答案 1 :(得分:3)
library(dplyr)
df %>%
group_by(Location) %>%
mutate(n = n())
# ID Location n
# <int> <int> <int>
# 1 1 54 2
# 2 2 35 2
# 3 3 54 2
# 4 4 35 2
# 5 5 71 1
答案 2 :(得分:2)
您可以使用ave
来计算与每个length
对应的数据Location
ave(1:NROW(df), df$Location, FUN = length)
#[1] 2 2 2 2 1
答案 3 :(得分:2)
也可以在data.table
中执行此操作:
library(data.table)
dt[,count := .N, by = Location]
dt
# ID Location count
#1: 1 54 2
#2: 2 35 2
#3: 3 54 2
#4: 4 35 2
#5: 5 71 1
数据:强>
dt <- fread("ID Location
1 54
2 35
3 54
4 35
5 71")