对于每个ID,我想在“距离”列中返回该值,该值首次变为负数。如果该值根本不为负,则返回该ID的值99(或其他随机数)。下面给出一个示例数据帧。
df <- data.frame(ID=c(rep(1, 4),rep(2,4),rep(3,4),rep(4,4),rep(5,4)),distance=rep(1:4,5), value=c(1,4,3,-1,2,1,-4,1,3,2,-1,1,-4,3,2,1,2,3,4,5))
> df
ID distance value
1 1 1 1
2 1 2 4
3 1 3 3
4 1 4 -1
5 2 1 2
6 2 2 1
7 2 3 -4
8 2 4 1
9 3 1 3
10 3 2 2
11 3 3 -1
12 3 4 1
13 4 1 -4
14 4 2 3
15 4 3 2
16 4 4 1
17 5 1 2
18 5 2 3
19 5 3 4
20 5 4 5
所需的输出如下
> df2
ID first_negative_distance
1 1 4
2 2 3
3 3 3
4 4 1
5 5 99
我尝试过,但无法弄清楚如何通过dplyr进行操作。任何帮助将非常感激。我正在处理的实际数据具有数千个ID,每个ID具有30个不同的距离级别。请记住,对于任何ID,可能会有多个负值实例。我只需要第一个。
编辑: 尝试了AntonoisK提出的解决方案。
> df%>%group_by(ID)%>%summarise(first_neg_dist=first(distance[value<0]))
first_neg_dist
1 4
这是我得到的结果。与Antonois得到的不匹配。不知道为什么。
答案 0 :(得分:0)
library(dplyr)
df %>%
group_by(ID) %>%
summarise(first_neg_dist = first(distance[value < 0]))
# # A tibble: 5 x 2
# ID first_neg_dist
# <dbl> <int>
# 1 1 4
# 2 2 3
# 3 3 3
# 4 4 1
# 5 5 NA
如果您真的更喜欢99
而不是NA
,则可以使用
summarise(first_neg_dist = coalesce(first(distance[value < 0]), 99L))
相反。