在保持列的同时,将每列中的最后3个非NA列入列表

时间:2017-12-19 22:38:10

标签: r

我有这样的df1:

Date <-c("12/10/17","12/11/17","12/12/17","12/13/17","12/14/17","12/15/17","12/16/17")
Ben <- c(1294,NA,8959,2345,NA,0303,NA)
James <- c(NA,4523,3246,NA,NA,NA,NA)
Alex <- c(3754,1122,5582,NA,2910,NA,NA)
df1 <- data.frame(Date,Ben,James,Alex)`

#df1
Date          Ben     James     Alex
12/10/17      1294    NA        3754
12/11/17      NA      4523      1122
12/12/17      8959    3246      5582
12/13/17      2345    NA        NA
12/14/17      NA      NA        2910
12/15/17      0303    NA      NA
12/16/17      NA      NA      NA

我想获得一个列表,该列表从每列中获取最后3个非NA值并保持其列。如果列中的非NA值少于3个,则会列出其中的值,因此列的长度可能不等:

Ben     James     Alex
8959    4523      1122
2345    3246      5582
0303              2910  

这将获得最后3个,但将它们全部放在一个未分类的向量中:

c(sapply(df[-1], function(x) sprintf("%s", tail(x[!is.na(x)], 3))))

3 个答案:

答案 0 :(得分:0)

不确定我明白你的意思&#34;将它们全部放在一个未分类的矢量&#34; 中。这不是你想要的吗?

lapply(df1[-1], function(x) tail(x[!is.na(x)], n = 3))
#$Ben
#[1] 8959 2345  303
#
#$James
#[1] 4523 3246
#
#$Alex
#[1] 1122 5582 2910

答案 1 :(得分:0)

temp = c(sapply(df1[-1], function(x) sprintf("%s", tail(x[!is.na(x)], 3))))

out = as.data.frame(t(plyr::rbind.fill.matrix(lapply(temp, t))))
colnames(out) = colnames(df1[-1])

答案 2 :(得分:0)

你的意思是你想在一个载体中使用它们吗?

Date <-c("12/10/17","12/11/17","12/12/17","12/13/17","12/14/17","12/15/17","12/16/17")
Ben <- c(1294,NA,8959,2345,NA,0303,NA)
James <- c(NA,4523,3246,NA,NA,NA,NA)
Alex <- c(3754,1122,5582,NA,2910,NA,NA)
df1 <- data.frame(Date,Ben,James,Alex)

library(purrr)
library(dplyr)
df1 %>% 
  select(-Date) %>% 
  map(~tail(na.omit(.x), 3)) %>% 
  flatten_dbl()

可生产

[1] 8959 2345  303 4523 3246 1122 5582 2910