我想選擇按 ID 分組的第二個最低 DATE(如果有多個 DATE),然后將結果變異為一個新列(新)。
DF<-tibble::tribble(
~ID, ~DATE,
1L, "2001-01-01",
2L, "2002-02-02",
2L, "2002-02-02",
3L, "2004-04-04",
3L, "2005-05-05",
4L, "2006-06-06",
4L, "2006-06-06",
4L, "2007-07-07"
)
# A tibble: 8 × 2
ID DATE
<int> <chr>
1 1 2001-01-01
2 2 2002-02-02
3 2 2002-02-02
4 3 2004-04-04
5 3 2005-05-05
6 4 2006-06-06
7 4 2006-06-06
8 4 2007-07-07
期望的輸出:
# A tibble: 8 × 3
ID DATE NEW
<int> <chr> <chr>
1 1 2001-01-01 NA
2 2 2002-02-02 NA
3 2 2002-02-02 NA
4 3 2004-04-04 2005-05-05
5 3 2005-05-05 2005-05-05
6 4 2006-06-06 2007-07-07
7 4 2006-06-06 2007-07-07
8 4 2007-07-07 2007-07-07
最好的問候,H
uj5u.com熱心網友回復:
只需添加unique以在選擇第二個日期時僅考慮唯一日期。
library(tidyverse)
DF %>%
mutate(DATE = as.Date(DATE)) %>%
group_by(ID) %>%
arrange(ID, DATE) %>%
mutate(NEW = unique(DATE)[2])
輸出
ID DATE NEW
<int> <date> <date>
1 1 2001-01-01 NA
2 2 2002-02-02 NA
3 2 2002-02-02 NA
4 3 2004-04-04 2005-05-05
5 3 2005-05-05 2005-05-05
6 4 2006-06-06 2007-07-07
7 4 2006-06-06 2007-07-07
8 4 2007-07-07 2007-07-07
uj5u.com熱心網友回復:
只需扔掉uniques,即length(unique(x)) == 1。
transform(DF, NEW=ave(DATE, ID, FUN=\(x) {
if (NROW(x) == 1 || length(unique(x)) == 1) NA
else x[order(as.Date(x)) == 2]
}))
# ID DATE NEW
# 1 1 2001-01-01 <NA>
# 2 2 2002-02-02 <NA>
# 3 2 2002-02-02 <NA>
# 4 3 2004-04-04 2005-05-05
# 5 3 2005-05-05 2005-05-05
# 6 4 2006-06-06 2006-06-06
# 7 4 2006-06-06 2006-06-06
# 8 4 2007-07-07 2006-06-06
其余的,使用ave和order使用案例處理來產生 NA 就像我的其他答案一樣。
uj5u.com熱心網友回復:
一個選項 data.table
library(data.table)
library(dplyr)
setDT(DF)[order(ID, DATE), NEW := nth(unique(DATE), 2), by = ID]
-輸出
> DF
ID DATE NEW
1: 1 2001-01-01 <NA>
2: 2 2002-02-02 <NA>
3: 2 2002-02-02 <NA>
4: 3 2004-04-04 2005-05-05
5: 3 2005-05-05 2005-05-05
6: 4 2006-06-06 2007-07-07
7: 4 2006-06-06 2007-07-07
8: 4 2007-07-07 2007-07-07
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393441.html
標籤:r
上一篇:從整數向量手動構造因子
下一篇:基于一列和一行合并兩個資料集
