簡體   English   中英

根據最大日期和最接近的日期選擇列值

[英]select column values based on max date and closest date

我有一個數據集如下

Id    BMI    Date        Case   CaseDate 
1331  28.2   2012-05-15  No     NA
1331  26.4   2011-04-06  No     NA
1331  29.37  2014-04-01  No     NA
5074  30.02  2009-10-23  Yes    2014-08-06
5074  25.12  2011-07-15  Yes    2014-08-06

我想做的如下

1)對於Case=No Id,選擇最接近當前日期的BMI (Sys.Date ())並將此值存儲在新列( New_BMI )中

2)對於Case=Yes Id,在CaseDate列中選擇最接近日期的BMI並將此值存儲在新列中( New_BMI

最終輸出應如下所示。

Id    BMI    Date        Case   CaseDate     New_BMI
1331  28.2   2012-05-15  No     NA           29.37
1331  26.4   2011-04-06  No     NA           29.37
1331  29.37  2014-04-01  No     NA           29.37
5074  30.02  2009-10-23  Yes    2014-08-06   25.12
5074  25.12  2011-07-15  Yes    2014-08-06   25.12

ID 1331的New_BMI的值為29.37,因為它是最接近當前日期的值。 ID 5074的New_BMI的值為25.12,因為它是最接近CaseDate (2014-08-06)的值。

人們對如何計算此New_BMI任何幫助New_BMI感謝。

首先,請確保您具有Date類對象。

df$Date <- as.Date(df$Date)
df$CaseDate <- as.Date(df$CaseDate)

然后使用dplyr,一種方法是按ID分組並測試條件。 主要函數調用為BMI[which.min(Sys.Date() - Date)] 這會根據當前日期和Date列之間的最小長度將BMI列作為子集。 對於CaseDate也是如此。

library(dplyr)
df %>% 
  group_by(Id) %>% 
  mutate(New_BMI = ifelse(Case == "No", BMI[which.min(Sys.Date() - Date)], 
                                        BMI[which.min(CaseDate - Date)]))
# Source: local data frame [5 x 6]
# Groups: Id [2]
# 
#      Id   BMI       Date   Case   CaseDate New_BMI
#   (int) (dbl)     (date) (fctr)     (date)   (dbl)
# 1  1331 28.20 2012-05-15     No       <NA>   29.37
# 2  1331 26.40 2011-04-06     No       <NA>   29.37
# 3  1331 29.37 2014-04-01     No       <NA>   29.37
# 4  5074 30.02 2009-10-23    Yes 2014-08-06   25.12
# 5  5074 25.12 2011-07-15    Yes 2014-08-06   25.12

數據

df <- structure(list(Id = c(1331L, 1331L, 1331L, 5074L, 5074L), BMI = c(28.2, 
26.4, 29.37, 30.02, 25.12), Date = structure(c(4L, 2L, 5L, 1L, 
3L), .Label = c("2009-10-23", "2011-04-06", "2011-07-15", "2012-05-15", 
"2014-04-01"), class = "factor"), Case = structure(c(1L, 1L, 
1L, 2L, 2L), .Label = c("No", "Yes"), class = "factor"), CaseDate = structure(c(NA, 
NA, NA, 1L, 1L), .Label = "2014-08-06", class = "factor")), .Names = c("Id", 
"BMI", "Date", "Case", "CaseDate"), class = "data.frame", row.names = c(NA, 
-5L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM