R:当另一列中的值首次变为负值时,返回一列中的值

时间:2018-10-11 12:34:41

标签: r dataframe

对于每个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得到的不匹配。不知道为什么。

1 个答案:

答案 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))

相反。