[英]Group by condition with no aggregate R
我有一個 dataframe,我想按 ID 和日期分組,但沒有任何聚合 function。因為我的 dataframe 是這樣的
ID | 日期 | 值 1 | 值 2 | 值 3 | 值 4 |
---|---|---|---|---|---|
ID1 | 2018-02-08 01:00:00 | 10 | 北美 | 北美 | 北美 |
ID1 | 2018-02-08 01:00:00 | 北美 | 30 | 北美 | 北美 |
ID1 | 2018-02-08 01:00:00 | 北美 | 北美 | 90后 | 北美 |
ID1 | 2018-02-08 01:00:00 | 北美 | 北美 | 北美 | 60 |
我想要做的是向上移動連續列的值,以便在一行中具有相同 DATE 和相同 ID 的值。
預期結果
ID | 日期 | 值 1 | 值 2 | 值 3 | 值 4 |
---|---|---|---|---|---|
ID1 | 2018-02-08 01:00:00 | 10 | 30 | 90后 | 60 |
我不確定“聚合函數”是什么意思。 你能解釋一下你的意思嗎?
我會這樣做的,但我懷疑這不是您要找的東西?
library(tidyverse)
d <-structure(list(ID = c("ID1", "ID1", "ID1", "ID1"),
DATE = c("2018-02-08 01:00:00","2018-02-08 01:00:00",
"2018-02-08 01:00:00", "2018-02-08 01:00:00"),
VAL.1 = c(10L, NA, NA, NA),
VAL.2 = c(NA, 30L, NA, NA),
VAL.3 = c(NA, NA, 90L, NA),
VAL.4 = c(NA, NA, NA, 60L)),
class = "data.frame",
row.names = c(NA,-4L))
d %>% pivot_longer(-c("ID", "DATE")) %>%
filter(!is.na(value)) %>%
pivot_wider(names_from = "name", values_from = "value")
#> # A tibble: 1 × 6
#> ID DATE VAL.1 VAL.2 VAL.3 VAL.4
#> <chr> <chr> <int> <int> <int> <int>
#> 1 ID1 2018-02-08 01:00:00 10 30 90 60
創建於 2022-12-06,使用reprex v2.0.2
使用summarise
with across
和na.omit
:
library(dplyr)
library(tidyr)
data |>
group_by(ID, DATE) |>
summarise(across(starts_with("VAL"), na.omit)) |>
ungroup()
或fill
和slice
(或distinct
):
library(dplyr)
library(tidyr)
data |>
group_by(ID, DATE) |>
fill(starts_with("VAL"), .direction = "downup") |>
slice(1) |>
ungroup()
Output:
# A tibble: 1 × 6
ID DATE VAL1 VAL2 VAL3 VAL4
<chr> <date> <dbl> <dbl> <dbl> <dbl>
1 ID1 2018-02-08 10 30 90 60
數據:
library(readr)
data <- read_table("ID DATE VAL1 VAL2 VAL3 VAL4
ID1 2018-02-08 10 NA NA NA
ID1 2018-02-08 NA 30 NA NA
ID1 2018-02-08 NA NA 90 NA
ID1 2018-02-08 NA NA NA 60")
``
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.