【问题标题】:Dealing with values that occur on the same date [duplicate]处理发生在同一日期的值[重复]
【发布时间】:2023-03-26 22:19:02
【问题描述】:

如何在同一数据框中的两个不同列之间查找同一日期出现的值。删除 A01_CD 列中出现的值并将其替换为 NA。如果 A01_CD 有值,则应将其移至 A01,而 NA 应放置在 A01 中。我一直在尝试使用重复()和唯一()和ifelse,但我失败了。请协助。

我的数据框

    Date         A01        A01_CD
1   1966/05/07  4.870000    4.870
2   1966/05/08  4.918333    NA
3   1966/05/09  4.892000    4.860
4   1966/05/10  4.858917    NA
5   1966/05/11  4.842000    NA
211 1967/03/18  NA          5.95

期望的结果

    Date         A01        A01_CD
1   1966/05/07  4.870000    NA
2   1966/05/08  4.918333    NA
3   1966/05/09  4.892000    NA
4   1966/05/10  4.858917    NA
5   1966/05/11  4.842000    NA
211 1967/03/18  5.95        NA

【问题讨论】:

    标签: r if-statement unique


    【解决方案1】:

    coalesce 的选项将返回作为每行参数给出的不同列中的第一个非 NA 元素

    library(dplyr)
    df1 %>%
       transmute(Date, A01 = coalesce(A01, A01_CD), A01_CD = NA_real_)
    #       Date      A01 A01_CD
    #1 1966/05/07 4.870000     NA
    #2 1966/05/08 4.918333     NA
    #3 1966/05/09 4.892000     NA
    #4 1966/05/10 4.858917     NA
    #5 1966/05/11 4.842000     NA
    #6 1967/03/18 5.950000     NA
    

    或在base R 中使用行/列索引

    df1$A01 <- df1[-1][cbind(seq_len(nrow(df1)), max.col(!is.na(df1[-1]), 'first'))]
    df1$A01
    #[1] 4.870000 4.918333 4.892000 4.858917 4.842000 5.950000
    

    数据

    df1 <- structure(list(Date = c("1966/05/07", "1966/05/08", "1966/05/09", 
    "1966/05/10", "1966/05/11", "1967/03/18"), A01 = c(4.87, 4.918333, 
    4.892, 4.858917, 4.842, NA), A01_CD = c(4.87, NA, 4.86, NA, NA, 
    5.95)), class = "data.frame", row.names = c("1", "2", "3", "4", 
    "5", "211"))
    

    【讨论】:

    • 不错的阿克伦。我想添加一个A01_CD = NA 将允许与预期结果完全匹配(尽管为什么 OP 想要一个 NA 列尚不清楚)
    【解决方案2】:
    DF <- DF %>% mutate(A01 = ifelse(is.na(A01), A01_CD, A01),
                        A01_CD =NA)
    

    这也有帮助。 我需要 NA 列只是为了跟踪我想做的事情是否正在发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2011-02-18
      • 2014-03-04
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      相关资源
      最近更新 更多