假设我的数据看起来像这样:
df
ID Location
1 54
2 35
3 54
4 35
5 71
我有兴趣找到访问给定位置的频率,然后根据位置列中的值将该频率(即sum(分配给新列。
开始,我尝试使用table
函数:
count<-as.data.frame(table(df))
count
var1 freq
54 2
35 2
71 1
从这里开始,我想在DF中创建一个新列,称为Count,该列为每个ID分配了与位置= 54相对应的每个ID。即,DF现在看起来像这样:
df
ID Location count
1 54 2
2 35 2
3 54 2
4 35 2
5 71 1
我的真实数据包含太多的位置值,以至于我无法编写IFELSE语句以有条件地分配这些计数值。我不确定如何以有效的方式完成(我也可以创建一个空列并在dplyr中使用replace
函数,但这同样费力。有任何技巧?
谢谢!
我们可以从dplyr
中使用add_count
(在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")
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
您可以使用ave
来计数与每个Location
length
ave(1:NROW(df), df$Location, FUN = length)
#[1] 2 2 2 2 1
也可以在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")