繁体   English   中英

R 过滤器 | 按条件过滤和分组

[英]R filter | Filtering and grouping with condition

我已经坚持了一段时间,如果有人可以帮忙。 我有一个看起来像这样的数据集

Col1 Date           Value
A    2019-01-01      NA
A    2019-01-02      4
A    2019-01-03      NA
B    2019-02-01      NA
B    2019-02-02      NA
B    2019-02-03      1
C    2019-03-01      NA
C    2019-03-02      NA
C    2019-03-03      NA

我想创建一个表,它为每个唯一的 A/B/C 给出在“值”列或第一行中具有值的行(如果没有(如 C 的情况)),即,结果输出应该看起来喜欢

    Col1 Date           Value
    A    2019-01-02      4
    B    2019-02-03      1
    C    2019-03-01      NA

我们可以按 'Col1' 分组, slice第一个非 NA 行,或者if所有 'Value' 都是NA ,则返回第一行

library(dplyr)
df1 %>% 
   group_by(Col1) %>%
   slice(if(all(is.na(Value))) 1 else which(!is.na(Value))[1])

-输出

# A tibble: 3 x 3
# Groups:   Col1 [3]
#  Col1  Date       Value
#  <chr> <chr>      <int>
#1 A     2019-01-02     4
#2 B     2019-02-03     1
#3 C     2019-03-01    NA

或者另一种选择是先arrange然后在第一行做slice

df1 %>% 
     group_by(Col1) %>%
     arrange(is.na(Value), .by_group = TRUE) %>%
     slice(1)

数据

df1 <- structure(list(Col1 = c("A", "A", "A", "B", "B", "B", "C", "C", 
"C"), Date = c("2019-01-01", "2019-01-02", "2019-01-03", "2019-02-01", 
"2019-02-02", "2019-02-03", "2019-03-01", "2019-03-02", "2019-03-03"
), Value = c(NA, 4L, NA, NA, NA, 1L, NA, NA, NA)), 
class = "data.frame", row.names = c(NA, 
-9L))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM