【问题标题】:Set Certain Values to a Data Frame Based a Date Criteria将某些值设置为基于日期条件的数据框
【发布时间】:2017-02-23 16:46:48
【问题描述】:

我想将值 NA 设置为某个日期之前出现的数据框中的某些行/列。但每一列都有不同的日期/标准。那么这将如何运作呢?

示例数据框:

dates <- c("01/01/2015", "06/15/2015", "11/30/2015")
a <- c(1, 2, 3)
b <- c(2, 4, 6)
c <- c(3, 5, 9)
df <- data.frame(Date = dates, A = a, B = b, C = c)

startDate <- c("02/20/2015", "07/28/2015", "12/01/2015")

所以我的 data.frame 看起来像这样:

    Date        A      B     C
    01/01/2015  1      2     3
    06/15/2015  2      4     5
    11/30/2015  3      6     9

使用startDate 作为我的标准,我想将相关列中该日期之前的任何值设置为NA,以便我的最终结果如下所示:

    Date        A      B     C
    01/01/2015  NA     NA    NA
    06/15/2015  2      NA    NA
    11/30/2015  3      6     NA

有人可以帮我吗? 顺便说一句,我真正的 data.frame 有大约 20 多列。以上只是我实际问题的一个较小示例。

提前致谢!

【问题讨论】:

    标签: r dataframe criteria


    【解决方案1】:

    测试一下:

    #Do a pairwise comparison of dates using outer
    m = matrix(
        as.numeric(
            outer(as.Date(as.character(df[,1]), format = "%m/%d/%Y"),
                  as.Date(as.character(startDate), format = "%m/%d/%Y"), ">" )
        ),
        nrow = nrow(df))
    
    m[m == 0] = NA #Set zeroes in m to NA
    df[,2:ncol(df)] = df[,2:ncol(df)] * m #Multiply the columns of df (except 1st) with m
    df
    #        Date  A  B  C
    #1 01/01/2015 NA NA NA
    #2 06/15/2015  2 NA NA
    #3 11/30/2015  3  6 NA 
    

    【讨论】:

    • 谢谢你 - 不过,如果 startDate 之后的值为零,则在下一步中用 NA 替换零不一定有效,对吧?
    • @RiddleMeThis,输出应该是你现在想要的。下一步无需转换为NA
    • 我认为实际上最好不要乘以 m 而是除以 m。这将为您提供 NaN 和 Inf 值,然后您可以使用类似 do.call(df, lapply(df, function(x) replace(x, is.infinite(x),NA))) 将值转换为 NA .非常感谢!这对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多