我有这样的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))
答案 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