【问题标题】:dplyr::first() to choose first non NA valuedplyr::first() 选择第一个非 NA 值
【发布时间】:2018-09-07 10:53:57
【问题描述】:

我正在寻找一种方法来从每个组中提取第一个和最后一个非 NA 值。我正在使用 dplyr::first() 和 dplyr::last(),但我不知道如何选择第一个或最后一个非 NA 值。

library(dplyr)
set.seed(123)
d <- data.frame(
  group = rep(1:3, each = 3),
  year = rep(seq(2000,2002,1),3),
  value = sample(1:9, r = T))

#Introduce NA values in first row of group 2 and last row of group 3
d %>%
  mutate(
    value = case_when(
      group == 2 & year ==2000 ~ NA_integer_,
      group == 3 & year ==2002 ~ NA_integer_,
      TRUE ~ value))%>%
  group_by(group) %>% 
  mutate(
    first = dplyr::first(value),
    last = dplyr::last(value))

结果(有问题)

# A tibble: 9 x 5
# Groups:   group [3]
  group  year value first  last
  <int> <dbl> <int> <int> <int>
1     1  2000     3     3     4
2     1  2001     8     3     4
3     1  2002     4     3     4
4     2  2000    NA    NA     1
5     2  2001     9    NA     1
6     2  2002     1    NA     1
7     3  2000     5     5    NA
8     3  2001     9     5    NA
9     3  2002    NA     5    NA

您能帮我在第 2 组的“第一”列中设置值 = 9,在组 3 = 9 的“最后”列中设置值吗?

如果存在这样的解决方案,我非常喜欢 tidyverse 解决方案?

【问题讨论】:

  • 删除 NA,试试:first(na.omit(value)) ?
  • @zx8754 对不起种子 - 我更正了。删除 NA 将不起作用,因为这些行包含我需要的其他非 NA 值。
  • 我不是从数据框中删除 NA,而是仅在 first/last 函数中,请参阅下面我编辑的答案。

标签: r dplyr


【解决方案1】:

使用na.omit,比较:

first(c(NA, 11, 22))
# [1] NA

first(na.omit(c(NA, 11, 22)))
# [1] 11

使用示例数据:

d %>%
  mutate(
    value = case_when(
      group == 2 & year ==2000 ~ NA_integer_,
      group == 3 & year ==2002 ~ NA_integer_,
      TRUE ~ value))%>%
  group_by(group) %>% 
  mutate(
    first = dplyr::first(na.omit(value)),
    last = dplyr::last(na.omit(value)))

# # A tibble: 9 x 5
# # Groups:   group [3]
#   group  year value first  last
#   <int> <dbl> <int> <int> <int>
# 1     1  2000     3     3     4
# 2     1  2001     8     3     4
# 3     1  2002     4     3     4
# 4     2  2000    NA     9     1
# 5     2  2001     9     9     1
# 6     2  2002     1     9     1
# 7     3  2000     5     5     9
# 8     3  2001     9     5     9
# 9     3  2002    NA     5     9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-27
    • 2022-01-07
    • 2018-10-12
    • 2018-04-12
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多