【问题标题】:Subset a data set based on first non-NA values根据第一个非 NA 值对数据集进行子集
【发布时间】:2020-12-14 11:53:35
【问题描述】:

我有一个这样的数据框:

 Year S1  S2  S3
 1699 1   NA  NA
 1700 5   23  5
 1701 6   1   6
 1702 7   13  9

我只想保留第一个非 NA 年份等于或大于 1700 的列。在这种情况下,我想保留列 S2 和 S3 但不保留 S1(因为它的第一个非-NA 年份是 1699)。

我该怎么做?

【问题讨论】:

    标签: r na missing-data


    【解决方案1】:

    你可以使用Filter:

    result <- cbind(df1[1], Filter(function(x) 
                  df1$Year[which.max(!is.na(x))] >= 1700, df1[-1]))
    result
    #  Year S2 S3
    #1 1699 NA NA
    #2 1700 23  5
    #3 1701  1  6
    #4 1702 13  9
    

    【讨论】:

    • 请问[1]和[-1]在这里指的是什么?
    • -1 删除年份列,因为您要检查 S1 到 S3 列。为了将该列保留在最终输出中,我使用df[1]。
    【解决方案2】:

    像这样使用sapply。

    d[c(T, sapply(d[-1], function(x) d$Year[!is.na(x)][1]) >= 1700)]
    #   Year S2 S3
    # 1 1699 NA NA
    # 2 1700 23  5
    # 3 1701  1  6
    # 4 1702 13  9
    

    数据

    d <- read.table(header=TRUE, text="Year S1  S2  S3
    1699 1   NA  NA
    1700 5   23  5
    1701 6   1   6
    1702 7   13  9")
    

    【讨论】:

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