【问题标题】:merge date vectors inside a data frame合并数据框内的日期向量
【发布时间】:2012-11-27 17:36:34
【问题描述】:

我有一个数据结构 df 有一些日期向量,一到五,像这样,

df <- structure(list(one.date = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, "2012-09-23", "2012-09-23", NA, NA, NA, NA, NA, NA, NA, NA, NA), two.date = c(NA, "2012-11-13", NA, "2012-11-19", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "2012-09-24", NA, NA, NA), three.date = c(NA, NA, "2012-11-19", NA, NA, NA, NA, NA, "2012-09-22", NA, NA, NA, NA, NA, NA, NA, NA, "2012-09-24", NA, NA), four.date = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "2012-09-02", "2012-09-10","2012-09-23", NA, NA, NA, NA, NA, NA), five.date = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "2012-09-24", "2014-09-09", NA, NA, NA, NA)), .Names = c("one.date", "two.date", "three.date", "four.date", "five.date"), row.names = c(NA, 20L), class = "data.frame")
# > df
     one.date   two.date three.date  four.date  five.date
1        <NA>       <NA>       <NA>       <NA>       <NA>
2        <NA> 2012-11-13       <NA>       <NA>       <NA>
3        <NA>       <NA> 2012-11-19       <NA>       <NA>
4        <NA> 2012-11-19       <NA>       <NA>       <NA>
5        <NA>       <NA>       <NA>       <NA>       <NA>
6        <NA>       <NA>       <NA>       <NA>       <NA>
7        <NA>       <NA>       <NA>       <NA>       <NA>
8        <NA>       <NA>       <NA>       <NA>       <NA>
9        <NA>       <NA> 2012-09-22       <NA>       <NA>
10 2012-09-23       <NA>       <NA>       <NA>       <NA>
11 2012-09-23       <NA>       <NA>       <NA>       <NA>
12       <NA>       <NA>       <NA> 2012-09-02       <NA>
13       <NA>       <NA>       <NA> 2012-09-10       <NA>
14       <NA>       <NA>       <NA> 2012-09-23       <NA>
15       <NA>       <NA>       <NA>       <NA> 2012-09-24
16       <NA>       <NA>       <NA>       <NA> 2014-09-09
17       <NA> 2012-09-24       <NA>       <NA>       <NA>
18       <NA>       <NA> 2012-09-24       <NA>       <NA>
19       <NA>       <NA>       <NA>       <NA>       <NA>
20       <NA>       <NA>       <NA>       <NA>       <NA>

现在,我想将它们组合或合并为一个向量。像这样,

            date  one.date   two.date three.date  four.date  five.date
  1        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
  2  2012-11-13       <NA> 2012-11-13       <NA>       <NA>       <NA>
  3  2012-11-19       <NA>       <NA> 2012-11-19       <NA>       <NA>
  4  2012-11-19       <NA> 2012-11-19       <NA>       <NA>       <NA>
  5        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
  6        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
  7        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
  8        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
  9  2012-09-22       <NA>       <NA> 2012-09-22       <NA>       <NA>
  10 2012-09-23 2012-09-23       <NA>       <NA>       <NA>       <NA>
  11 2012-09-23 2012-09-23       <NA>       <NA>       <NA>       <NA>
  12 2012-09-02       <NA>       <NA>       <NA> 2012-09-02       <NA>
  13 2012-09-10       <NA>       <NA>       <NA> 2012-09-10       <NA>
  14 2012-09-23       <NA>       <NA>       <NA> 2012-09-23       <NA>
  15 2012-09-24       <NA>       <NA>       <NA>       <NA> 2012-09-24
  16 2014-09-09       <NA>       <NA>       <NA>       <NA> 2014-09-09
  17 2012-09-24       <NA> 2012-09-24       <NA>       <NA>       <NA>
  18 2012-09-24       <NA>       <NA> 2012-09-24       <NA>       <NA>
  19       <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
  20       <NA>       <NA>       <NA>       <NA>       <NA>       <NA>

任何帮助将不胜感激。

【问题讨论】:

    标签: r date datetime data-management


    【解决方案1】:

    我假设每行最多有 1 个非NA 条目:

    as.vector(apply(df,1,function(x) ifelse(all(is.na(x)),NA,x[!is.na(x)])))
     [1] NA           "2012-11-13" "2012-11-19" "2012-11-19" NA          
     [6] NA           NA           NA           "2012-09-22" "2012-09-23"
    [11] "2012-09-23" "2012-09-02" "2012-09-10" "2012-09-23" "2012-09-24"
    [16] "2014-09-09" "2012-09-24" "2012-09-24" NA           NA
    

    或者将其作为原始数据中的一个因素:

    cbind(list(date=as.factor(apply(df,1,function(x) ifelse(all(is.na(x)),NA,x[!is.na(x)])))),df)
             date   one.date   two.date three.date  four.date  five.date
    1        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
    2  2012-11-13       <NA> 2012-11-13       <NA>       <NA>       <NA>
    3  2012-11-19       <NA>       <NA> 2012-11-19       <NA>       <NA>
    4  2012-11-19       <NA> 2012-11-19       <NA>       <NA>       <NA>
    5        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
    6        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
    7        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
    8        <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
    9  2012-09-22       <NA>       <NA> 2012-09-22       <NA>       <NA>
    10 2012-09-23 2012-09-23       <NA>       <NA>       <NA>       <NA>
    11 2012-09-23 2012-09-23       <NA>       <NA>       <NA>       <NA>
    12 2012-09-02       <NA>       <NA>       <NA> 2012-09-02       <NA>
    13 2012-09-10       <NA>       <NA>       <NA> 2012-09-10       <NA>
    14 2012-09-23       <NA>       <NA>       <NA> 2012-09-23       <NA>
    15 2012-09-24       <NA>       <NA>       <NA>       <NA> 2012-09-24
    16 2014-09-09       <NA>       <NA>       <NA>       <NA> 2014-09-09
    17 2012-09-24       <NA> 2012-09-24       <NA>       <NA>       <NA>
    18 2012-09-24       <NA>       <NA> 2012-09-24       <NA>       <NA>
    19       <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
    20       <NA>       <NA>       <NA>       <NA>       <NA>       <NA>
    

    【讨论】:

      【解决方案2】:
      df$onedate <- apply(df, 1, function(x) head(x[!is.na(x)], 1) )
      

      我将 head(., 1) 放入以处理可能有多个日期的情况。

      【讨论】:

        猜你喜欢
        • 2015-08-07
        • 2021-01-16
        • 1970-01-01
        • 2018-10-01
        • 1970-01-01
        • 2015-09-28
        • 2017-08-26
        • 2019-08-18
        • 2013-10-14
        相关资源
        最近更新 更多