r - 如何查找一行中第一个非空值的列名

标签 r dataframe

我正在处理一个查询的数据框,如下所示:

<表类=“s-表”> <标题> 用户 ID 2012-01-01 2012-02-01 2012-02-01 <正文> 单元格 1 不适用 2 不适用 单元 3 1 不适用 5

我想查找每个用户 ID 的第一个非空列(不包括用户 ID 列)的日期(列名称)、最后一个非空列的名称以及这些日期之间的持续时间。

谢谢!

我已经尝试过:

df$min_date<-apply(df[-1], 1, function(x) 
   x[which.min(which(is.na(x) == FALSE))])

df$min_date<-apply(df[-1], 1, function(x) 
   colnames(x[min(which(is.na(x) == FALSE))]))

但是没有成功

最佳答案

这个怎么样:

library(dplyr) 
library(tidyr)
d <- tibble::tribble(
  ~"User ID",   ~"2012-01-01",  ~"2012-02-01",  ~"2012-02-01", 
"Cell 1",   NA, 2,  NA,
"Cell 3",   1,  NA, 5)
d %>% 
  pivot_longer(-1, names_to="date", values_to = "vals") %>%
  na.omit() %>% 
  mutate(date = lubridate::ymd(date)) %>% 
  group_by(`User ID`) %>% 
  summarise(first = first(date), 
            last = last(date)) %>% 
  mutate(diff = last - first)
#> # A tibble: 2 × 4
#>   `User ID` first      last       diff   
#>   <chr>     <date>     <date>     <drtn> 
#> 1 Cell 1    2012-02-01 2012-02-01  0 days
#> 2 Cell 3    2012-01-01 2012-02-01 31 days

reprex package 于 2022 年 12 月 13 日创建(v2.0.1)

这是一种基本的 R 方式(尽管使用 lubridate),更符合您最初的想法:

d <- tibble::tribble(
  ~"User ID",   ~"2012-01-01",  ~"2012-02-01",  ~"2012-02-01", 
"Cell 1",   NA, 2,  NA,
"Cell 3",   1,  NA, 5)
d <- tibble::tribble(
  ~"User ID",   ~"2012-01-01",  ~"2012-02-01",  ~"2012-02-01", 
  "Cell 1", NA, 2,  NA,
  "Cell 3", 1,  NA, 5)

mind <- apply(d[,-1], 1, function(x)
  colnames(d[,-1])[min(which(!is.na(x)))])
maxd <- apply(d[,-1], 1, function(x)
  colnames(d[,-1])[max(which(!is.na(x)))])

d$min_date <- lubridate::ymd(mind)
d$max_date <- lubridate::ymd(maxd)
d$diff <- d$max_date - d$min_date

d
#> # A tibble: 2 × 7
#>   `User ID` `2012-01-01` `2012-02-01` `2012-02-01` min_date   max_date   diff   
#>   <chr>            <dbl>        <dbl>        <dbl> <date>     <date>     <drtn> 
#> 1 Cell 1              NA            2           NA 2012-02-01 2012-02-01  0 days
#> 2 Cell 3               1           NA            5 2012-01-01 2012-02-01 31 days

reprex package 于 2022 年 12 月 13 日创建(v2.0.1)

关于r - 如何查找一行中第一个非空值的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74790769/

相关文章:

list - 生成每个列表项中项数的向量

function - 获取 R 全局环境中加载的函数列表

r - 使用包 vegdist 在 R 中执行 NMDS 时出错

R自引用

python - Pandas:使用 iloc 检索数据与输入索引不匹配

r - 如何更改 ggplot2 点图上的网格线间距?

R:regexpr() 如何在模式参数中使用向量

Python:如何聚合 DataFrame 中的值

r - 操作数据框(使用 R)

python - 将 pandas 数据框中的列从 int 转换为 string