如何获得具有唯一 ID 而不是唯一 ID 的行 min

时间:2021-01-12 01:18:27

标签: r

我有一个如下所示的 data.frame:

enter image description here

我想构建一个可以捕获每个 ID 的 min(date1, date2, date3, date4) 的变量。我该怎么办?

我想知道两种情况:

  1. 如果每行 ID 都是唯一的;
  2. 如果 ID 不是唯一的;
  3. 如果一组变量具有相似的变量名称(例如 dateX),是否有一种简单的方法可以从它们中获取最小值?尽量避免输入 date1, date2, date3, date4

可以使用代码构建样本数据:

df <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 
29, 30, 31, 32), date1 = structure(c(1512432000, 1514937600, 
1517788800, 1524009600, 1541721600, 1554336000, 1562803200, 1562889600, 
1521504000, 1525392000, 1530576000, 1534291200, 1535414400, 1538697600, 
1541548800, 1545091200, 1549238400, 1551916800, 1553644800, 1554076800, 
1560384000, 1561420800, 1562716800, 1566432000, 1567555200, 1548979200, 
1554508800, 1555372800, 1556236800, 1561939200, 1563926400, 1563926400
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), date2 = structure(c(1512777600, 
1515283200, 1518134400, 1524355200, 1542067200, 1555459200, 1563148800, 
1563580800, NA, 1525737600, 1530921600, 1534636800, 1535760000, 
1539043200, 1541894400, 1545436800, 1549584000, 1552262400, 1553990400, 
1554422400, 1560729600, 1561766400, 1563062400, 1566777600, 1567900800, 
1549324800, 1554854400, 1555718400, 1556582400, 1562284800, 1564272000, 
1564272000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    date3 = structure(c(1512777600, 1515283200, 1518134400, 1524355200, 
    1542067200, NA, 1563148800, 1563580800, 1521849600, 1525737600, 
    NA, NA, NA, NA, 1541894400, 1545436800, 1549584000, 1552262400, 
    1553990400, 1554422400, 1560729600, 1561766400, 1563062400, 
    1566777600, 1567900800, 1549324800, 1554854400, 1555718400, 
    1556582400, 1562284800, 1564272000, 1564272000), class = c("POSIXct", 
    "POSIXt"), tzone = "UTC"), date4 = structure(c(NA, NA, NA, 
    NA, NA, 1555459200, NA, NA, NA, NA, NA, 1530921600, 1534636800, 
    1535760000, 1539043200, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA), class = c("POSIXct", "POSIXt"
    ), tzone = "UTC")), row.names = c(NA, -32L), class = c("tbl_df", 
"tbl", "data.frame"))\

谢谢。

1 个答案:

答案 0 :(得分:1)

也许你可以试试下面的data.table代码

setDT(df)[,
  min_date := as.Date(as.POSIXct(min(na.omit(unlist(.SD))), origin = "1970-01-01"), format = "%Y-%m-%d"),
  ID,
  .SDcols = patterns("^date")
]

给出

> df
    ID      date1      date2      date3      date4   min_date
 1:  1 2017-12-05 2017-12-09 2017-12-09       <NA> 2017-12-05
 2:  2 2018-01-03 2018-01-07 2018-01-07       <NA> 2018-01-03
 3:  3 2018-02-05 2018-02-09 2018-02-09       <NA> 2018-02-05
 4:  4 2018-04-18 2018-04-22 2018-04-22       <NA> 2018-04-18
 5:  5 2018-11-09 2018-11-13 2018-11-13       <NA> 2018-11-09
 6:  6 2019-04-04 2019-04-17       <NA> 2019-04-17 2019-04-04
 7:  7 2019-07-11 2019-07-15 2019-07-15       <NA> 2019-07-11
 8:  8 2019-07-12 2019-07-20 2019-07-20       <NA> 2019-07-12
 9:  9 2018-03-20       <NA> 2018-03-24       <NA> 2018-03-20
10: 10 2018-05-04 2018-05-08 2018-05-08       <NA> 2018-05-04
11: 11 2018-07-03 2018-07-07       <NA>       <NA> 2018-07-03
12: 12 2018-08-15 2018-08-19       <NA> 2018-07-07 2018-07-07
13: 13 2018-08-28 2018-09-01       <NA> 2018-08-19 2018-08-19
14: 14 2018-10-05 2018-10-09       <NA> 2018-09-01 2018-09-01
15: 15 2018-11-07 2018-11-11 2018-11-11 2018-10-09 2018-10-09
16: 16 2018-12-18 2018-12-22 2018-12-22       <NA> 2018-12-18
17: 17 2019-02-04 2019-02-08 2019-02-08       <NA> 2019-02-04
18: 18 2019-03-07 2019-03-11 2019-03-11       <NA> 2019-03-07
19: 19 2019-03-27 2019-03-31 2019-03-31       <NA> 2019-03-27
20: 20 2019-04-01 2019-04-05 2019-04-05       <NA> 2019-04-01
21: 21 2019-06-13 2019-06-17 2019-06-17       <NA> 2019-06-13
22: 22 2019-06-25 2019-06-29 2019-06-29       <NA> 2019-06-25
23: 23 2019-07-10 2019-07-14 2019-07-14       <NA> 2019-07-10
24: 24 2019-08-22 2019-08-26 2019-08-26       <NA> 2019-08-22
25: 25 2019-09-04 2019-09-08 2019-09-08       <NA> 2019-09-04
26: 26 2019-02-01 2019-02-05 2019-02-05       <NA> 2019-02-01
27: 27 2019-04-06 2019-04-10 2019-04-10       <NA> 2019-04-06
28: 28 2019-04-16 2019-04-20 2019-04-20       <NA> 2019-04-16
29: 29 2019-04-26 2019-04-30 2019-04-30       <NA> 2019-04-26
30: 30 2019-07-01 2019-07-05 2019-07-05       <NA> 2019-07-01
31: 31 2019-07-24 2019-07-28 2019-07-28       <NA> 2019-07-24
32: 32 2019-07-24 2019-07-28 2019-07-28       <NA> 2019-07-24
    ID      date1      date2      date3      date4   min_date
相关问题