根据特定列计算重复行的频率,但保留 R 中重复行之一的 ID
Calculate the frequency of duplicated rows, based on specific columns, but keeping the ID of one of the duplicated rows in R
我正在尝试根据特定列计算重复行的频率,但我想保留每个重复行的 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。我想要的是 a,b,c
和 ID = 1
,集合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
我正在尝试根据特定列计算重复行的频率,但我想保留每个重复行的 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。我想要的是 a,b,c
和 ID = 1
,集合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