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

问题描述 投票:0回答:3

我有一个像这样的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))))
r
3个回答
0
投票

不确定我理解你的意思是“将它们全部放在一个未分类的向量中”。这不是你想做的吗?

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

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])

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
© www.soinside.com 2019 - 2024. All rights reserved.