在R

时间:2017-12-27 15:19:22

标签: r

我有这样的DF:

Date <- c("10/17/17","11/11/17","11/23/17","11/25/17","12/3/17","12/10/17","12/16/17")
Ben <- c("1294",NA,"8959","2345",NA,"0303",NA)
James <- c(NA,"4523","3246",NA,"2394","8877","1427")
Alex <- c("3754","1122","5582",NA,"0094",NA,NA)
df1 <- data.frame(Date,Ben,James,Alex)

#df1
Date          Ben     James     Alex
10/17/17      1294    NA        3754
11/11/17      NA      4523      1122
11/23/17      8959    3246      5582
11/25/17      2345    NA        NA
12/3/17       NA      2394      0094
12/10/17      0303    8877      NA
12/16/17      NA      1427      NA

如您所见,DF按日期排序。我正在尝试将每列最新日期的2周内的值放入新的DF中,如下所示:

#df2
Ben     James     Alex
0303    1427      0094
NA      8877      5582
NA      2394      NA

Ben只有一个列出的值,因为在12/10/17的2周内只有一个非NA值,即Ben的列中具有非NA值的最新日期。詹姆斯最新的非NA日期是12/16/17。他有三个值在该日期的两周内:1427,8877和2394.Alex的最新日期是12/3/17。他在最近一个日期的两周内有两个值:0094和5582.新data.frame所拥有的行数应该等于最长的列。在相应的两周范围内具有较少条目的列应使用NA来填充数据,例如Ben的列。

我目前正在使用以下代码,它只是过滤每列中的最后3个非NA:

df2 <- lapply(df1[-1], function(x) tail(x[!is.na(x)], n = 3))

2 个答案:

答案 0 :(得分:0)

我是否理解您的要求,以下代码将为您提供帮助:

我已加载您的数据集(使用dput功能)

dataset <- structure(list(Date = structure(c(17456, 17481, 17493, 17495, 
17499, 17510, 17516), class = "Date"), Ben = c(1294L, NA, 8959L, 
2345L, NA, 303L, NA), James = c(NA, 4523L, 3246L, NA, NA, 8877L, 
1427L), Alex = c(3754L, 1122L, 5582L, NA, 94L, NA, NA)), .Names = c("Date", 
"Ben", "James", "Alex"), row.names = c(NA, -7L), class = "data.frame")

然后加载以下包:

library(lubridate)
library(tidyverse)

修复last_date并将格式更改为Date变量:

last_date <- mdy("12/16/17")
dataset$Date <- mdy(dataset$Date)

现在,让我们只选择你想要的行:

dataset_filtered <- dataset %>% 
    filter(Date<=last_date & Date>=(last_date-days(14)))

你将拥有:

        Date Ben James Alex
1 2017-12-10 303  8877   NA
2 2017-12-16  NA  1427   NA

请下次使用dput功能时,不一定是圣诞节; - )

答案 1 :(得分:0)

使用base r作为子集:

lapply(df1[-1],function(x)x[which((m<-tail(df1$Date[!is.na(x)],1)-df1$Date)>=0&m<=14)])->result
max(lengths(result))->len 
do.call(cbind.data.frame,lapply(result,`length<-`,len))

    Ben James Alex
1 <NA>  2394 5582
2 0303  8877 <NA>
3 <NA>  1427 0094

我刚刚意识到根据你提供的数据将它们编码为字符

为了完全按预期结果给出,我们将:

 do.call(cbind.data.frame,lapply(result,function(x) `length<-`(rev(x),len)))
  Ben James Alex
1 0303  1427 0094
2 <NA>  8877 <NA>
3 <NA>  2394 5582