我正在处理一个查询的数据框,如下所示:
我想查找每个用户 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/