我试图根据特定列计算重复行的频率,但我想保留每一个重复行的id,因为之后我需要它来合并其他数据集。
这是我的样本数据
############
## Sample ##
############
ID=seq(from=1,to=12,by=1)
var1=c(rep("a",12))
var2=c(rep("b",12))
var3=c("c","c","b","d","e","f","g","h","i","j","k","k")
df=data.frame(ID,var1,var2,var3)
df
ID var1 var2 var3
1 1 a b c
2 2 a b c
3 3 a b b
4 4 a b d
5 5 a b e
6 6 a b f
7 7 a b g
8 8 a b h
9 9 a b i
10 10 a b j
11 11 a b k
12 12 a b k
这是我的功能
freq.f<- function(data){
vari=colnames(data[2:ncol(data)])
data %>%
dplyr:: count(!!! rlang::syms(vari)) %>%
mutate(frequency = n/sum(n))
}
这是我的输出
freq.f(data=df)
var1 var2 var3 n frequency
1 a b b 1 0.08333333
2 a b c 2 0.16666667
3 a b d 1 0.08333333
4 a b e 1 0.08333333
5 a b f 1 0.08333333
6 a b g 1 0.08333333
7 a b h 1 0.08333333
8 a b i 1 0.08333333
9 a b j 1 0.08333333
10 a b k 2 0.16666667
如您所见,我将集合a,b,c
复制了2次,对应于ID
1和2。我想要的是带有ID = 1
的a,b,c
,与集合a,b,k
相同。因此,所需的输出将类似
# desired output
ID var1 var2 var3 n frequency
1 3 a b b 1 0.08333333
2 1 a b c 2 0.16666667
3 4 a b d 1 0.08333333
4 5 a b e 1 0.08333333
5 6 a b f 1 0.08333333
6 7 a b g 1 0.08333333
7 8 a b h 1 0.08333333
8 9 a b i 1 0.08333333
9 10 a b j 1 0.08333333
10 11 a b k 2 0.16666667
提前感谢您的帮助。
我们可以mutate
创建计数,然后filter
或slice
或使用distinct
library(dplyr)
df %>%
group_by(var1, var2, var3) %>%
mutate(n = n()) %>%
ungroup %>%
distinct(var1, var2, var3, .keep_all = TRUE) %>%
mutate(frequency = n/sum(n))
-输出
# A tibble: 10 x 6
# ID var1 var2 var3 n frequency
# <dbl> <chr> <chr> <chr> <int> <dbl>
# 1 1 a b c 2 0.167
# 2 3 a b b 1 0.0833
# 3 4 a b d 1 0.0833
# 4 5 a b e 1 0.0833
# 5 6 a b f 1 0.0833
# 6 7 a b g 1 0.0833
# 7 8 a b h 1 0.0833
# 8 9 a b i 1 0.0833
# 9 10 a b j 1 0.0833
#10 11 a b k 2 0.167
或使其与add_count
紧凑
df %>%
add_count(var1, var2, var3) %>%
distinct(var1, var2, var3, .keep_all = TRUE) %>%
mutate(frequency = n/sum(n))
或者,如果我们使用count
,则对原始数据执行right_join
,然后使用distinct
df %>%
count(var1, var2, var3) %>%
mutate(frequency = n/sum(n)) %>%
right_join(df) %>%
distinct(var1, var2, var3, .keep_all = TRUE)
基本R选项使用ave
+duplicated
+subset
subset(
transform(
transform(
df,
n = ave(ID, var1, var2, var3, FUN = length)
),
frequency = n / nrow(df)
),
!duplicated(cbind(var1, var2, var3))
)
它给出
ID var1 var2 var3 n frequency
1 1 a b c 2 0.16666667
3 3 a b b 1 0.08333333
4 4 a b d 1 0.08333333
5 5 a b e 1 0.08333333
6 6 a b f 1 0.08333333
7 7 a b g 1 0.08333333
8 8 a b h 1 0.08333333
9 9 a b i 1 0.08333333
10 10 a b j 1 0.08333333
11 11 a b k 2 0.16666667
下面是data.table
选项
dt <- as.data.table(df)
dt[
dt[
,
n := .N, var1:var3
][
, frequency := n / .N
][
, !duplicated(.SD),
.SDcols = var1:var3
]
]
它给出
ID var1 var2 var3 n frequency
1: 1 a b c 2 0.16666667
2: 3 a b b 1 0.08333333
3: 4 a b d 1 0.08333333
4: 5 a b e 1 0.08333333
5: 6 a b f 1 0.08333333
6: 7 a b g 1 0.08333333
7: 8 a b h 1 0.08333333
8: 9 a b i 1 0.08333333
9: 10 a b j 1 0.08333333
10: 11 a b k 2 0.16666667