【问题标题】:put last 3 non NAs from each column into list while maintaining columns将每列的最后 3 个非 NA 放入列表中,同时保持列
【发布时间】:2017-12-19 22:38:09
【问题描述】:

我有一个这样的 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


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:
      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])
      

      【讨论】:

      • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
      【解决方案3】:

      你的意思是你想让它们在一个向量中?

      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
      

      【讨论】:

        猜你喜欢
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多