作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有一个电子邮件数据集,每一行都有一个发件人和一个收件人。我们想要在数据集中找到下一次发件人和收件人互换的事件。因此,如果 sender==x & recipient==y
,我们将查找具有 sender==y & recipient==x
的下一行。随后,我们要计算这些观察值之间的差异。请参阅列 diff_count 以获得所需的输出。
# creating the data.frame
id = 1:10
sender = c(1, 2, 3, 2, 3, 1, 2, 1, 2, 3)
recipient = c(2, 1, 2, 3, 1, 2, 3, 3, 1, 1)
count = c(1, 4, 5, 7, 12, 17, 24, 31, 34, 41)
df <- data.frame(id, sender, recipient, count)
# output should look like this
df$diff_count <- c(3, 13, 2, NA, 19, 17, NA, 10, NA, NA)
如果没有更多的观测值满足要求,那么我们就填NA。使用 tidyverse 解决方案应该相对容易,但我似乎无法做到。
最佳答案
另一种 dplyr
-没有自定义函数但有几个自连接的方式:
library(dplyr)
data %>%
left_join(data,
by = c("sender" = "recipient", "recipient" = "sender"),
suffix = c("", ".y")) %>%
filter(id < id.y) %>%
group_by(id) %>%
slice_min(id.y) %>%
ungroup() %>%
mutate(diff_count = count.y - count) %>%
right_join(data) %>%
select(-matches("\\.(y|x)")) %>%
arrange(id)
返回
Joining, by = c("id", "sender", "recipient", "count")
# A tibble: 10 x 5
id sender recipient count diff_count
<int> <dbl> <dbl> <dbl> <dbl>
1 1 1 2 1 3
2 2 2 1 4 13
3 3 3 2 5 2
4 4 2 3 7 NA
5 5 3 1 12 19
6 6 1 2 17 17
7 7 2 3 24 NA
8 8 1 3 31 10
9 9 2 1 34 NA
10 10 3 1 41 NA
关于r - 如何在 R 的 data.frame 中找到下一个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68861849/
我是一名优秀的程序员,十分优秀!