【问题标题】:How to find the first observation of a column that matches a condition如何找到与条件匹配的列的第一个观察值
【发布时间】:2020-08-20 05:44:16
【问题描述】:

我有一个数据框:

df = tibble(a=c(7,6,10,12,12), b=c(3,5,8,8,7), c=c(4,4,12,15,20), week=c(1,2,3,4,5))

# A tibble: 5 x 4
      a     b     c  week
  <dbl> <dbl> <dbl> <dbl>
1     7     3     4     1
2     6     5     4     2
3    10     8    12     3
4    12     8    15     4
5    12     7    20     5

我希望每一列a, b and c 的观察值等于或超过10。 IE。对于a 列,它将是周3,对于b 列,它将是周NA,对于c 列,它也将是周3

理想的结果可能如下所示:

tibble(abc=c("a", NA, "b"), value=c(10, NA, 12), week=c(3, NA, 3))

# A tibble: 3 x 3
  abc   value  week
  <chr> <dbl> <dbl>
1 a        10     3
2 b        NA    NA
3 c        12     3

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    一种方法是获取长格式数据,并为每个列名选择第一个大于 10 的值。我们用complete 填充缺失的组合。

    library(dplyr)
    library(tidyr)
    
    df %>%
      pivot_longer(cols = -week, names_to = 'abc') %>%
      group_by(abc) %>%
      slice(which(value >= 10)[1]) %>%
      ungroup %>%
      complete(abc = names(df)[-4])
    
    # A tibble: 3 x 3
    #  abc    week value
    #  <chr> <dbl> <dbl>
    #1 a         3    10
    #2 b        NA    NA
    #3 c         3    12
    

    另一种方法是先计算出我们想要的,然后将数据集转换成长格式。

    df %>%
      summarise(across(a:c, list(week = ~week[which(. >= 10)[1]], 
                                 value = ~.[. >= 10][1]))) %>%
      pivot_longer(cols = everything(), 
                   names_to = c('abc', '.value'), 
                   names_sep = "_")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2017-01-26
      • 2016-09-09
      • 2020-06-28
      • 2021-12-05
      相关资源
      最近更新 更多