在 R 中,每个 ID 重复列值的平均数量是多少?
In R, what's the average number of repeated column values per ID?
背景
我有这个 R
数据框,d
:
d <- data.frame(ID = c("a","a","a","a","a","a","b","b"),
event = c("G12","G12","G12","B4","B4","A24","L5","L5"),
stringsAsFactors=FALSE)
看起来像这样:
如您所见,其中有 2 个不同的 ID
,每个都有 events
,其中一些重复 / 重复了任意次数。
问题
我想弄清楚此数据框中每个 ID
的平均重复 event
次数。
一目了然,您会看到 id
= a 有 2 个事件重复 -- G12,重复两次(总共 3 个条目)和 B4,重复一次(总共 2 个条目)。 id
= b 有 1 事件重复:L5。请注意,这里每个 repeat/duplicate 出现多少次与我无关;重要的是每个 ID
.
至少有一个重复的 event
所以我想要的结果是一个简单的均值列表:
(2 重复的事件 + 1 重复的事件) / 2 人 = 1.5
我试过的
感谢像 这样的帖子,我已经有点接近了,但我还不够:
d %>% summarise(mean = mean(duplicated(event)))
这可以运行,但它没有考虑到重复发生在 ID
内(或者至少,我是这样看的)。
这是你想要的吗?
d %>%
group_by(event , ID) %>%
dplyr::summarise(n = n()) %>%
filter(n > 1) %>%
group_by(ID) %>%
dplyr::summarise(n = n()) %>%
summarise(result = mean(n))
result
1 1.5
对于d
ID event
1 Bill 1
2 Bill 1
3 Bill 2
4 Bill 2
5 Bill 3
6 Bill 3
7 Bill 4
8 Bill 4
9 Sarah 1
10 Sarah 1
11 Sarah 2
12 Sarah 2
13 Sarah 3
14 Sarah 3
15 Sarah 4
16 Sarah 4
17 Sarah 5
18 Sarah 5
19 Jane 1
20 Jane 1
result
1 3.333333
对代码进行少量检查
d %>%
group_by(event , ID) %>%
dplyr::summarise(n = n()) %>%
filter(n > 1) %>%
group_by(ID) %>%
dplyr::summarise(n = n())
ID n
<chr> <int>
1 Bill 4
2 Jane 1
3 Sarah 5
对于每个 ID
,您可以计算出现多次的 event
,然后计算比率。
library(dplyr)
d %>%
group_by(ID) %>%
summarise(dup = sum(table(event) > 1)) %>%
summarise(ratio = mean(dup))
# ratio
# <dbl>
#1 1.5
我们可以在 base R
中轻松做到这一点
mean(rowSums(table(d) > 1))
[1] 1.5
或与dplyr
library(dplyr)
d %>%
count(event, ID) %>%
summarise(ratio = mean(rowsum(+(n> 1), ID)))
ratio
1 1.5
背景
我有这个 R
数据框,d
:
d <- data.frame(ID = c("a","a","a","a","a","a","b","b"),
event = c("G12","G12","G12","B4","B4","A24","L5","L5"),
stringsAsFactors=FALSE)
看起来像这样:
如您所见,其中有 2 个不同的 ID
,每个都有 events
,其中一些重复 / 重复了任意次数。
问题
我想弄清楚此数据框中每个 ID
的平均重复 event
次数。
一目了然,您会看到 id
= a 有 2 个事件重复 -- G12,重复两次(总共 3 个条目)和 B4,重复一次(总共 2 个条目)。 id
= b 有 1 事件重复:L5。请注意,这里每个 repeat/duplicate 出现多少次与我无关;重要的是每个 ID
.
event
所以我想要的结果是一个简单的均值列表:
(2 重复的事件 + 1 重复的事件) / 2 人 = 1.5
我试过的
感谢像
d %>% summarise(mean = mean(duplicated(event)))
这可以运行,但它没有考虑到重复发生在 ID
内(或者至少,我是这样看的)。
这是你想要的吗?
d %>%
group_by(event , ID) %>%
dplyr::summarise(n = n()) %>%
filter(n > 1) %>%
group_by(ID) %>%
dplyr::summarise(n = n()) %>%
summarise(result = mean(n))
result
1 1.5
对于d
ID event
1 Bill 1
2 Bill 1
3 Bill 2
4 Bill 2
5 Bill 3
6 Bill 3
7 Bill 4
8 Bill 4
9 Sarah 1
10 Sarah 1
11 Sarah 2
12 Sarah 2
13 Sarah 3
14 Sarah 3
15 Sarah 4
16 Sarah 4
17 Sarah 5
18 Sarah 5
19 Jane 1
20 Jane 1
result
1 3.333333
对代码进行少量检查
d %>%
group_by(event , ID) %>%
dplyr::summarise(n = n()) %>%
filter(n > 1) %>%
group_by(ID) %>%
dplyr::summarise(n = n())
ID n
<chr> <int>
1 Bill 4
2 Jane 1
3 Sarah 5
对于每个 ID
,您可以计算出现多次的 event
,然后计算比率。
library(dplyr)
d %>%
group_by(ID) %>%
summarise(dup = sum(table(event) > 1)) %>%
summarise(ratio = mean(dup))
# ratio
# <dbl>
#1 1.5
我们可以在 base R
mean(rowSums(table(d) > 1))
[1] 1.5
或与dplyr
library(dplyr)
d %>%
count(event, ID) %>%
summarise(ratio = mean(rowsum(+(n> 1), ID)))
ratio
1 1.5