【问题标题】:Selecting between rows in a dataframe在数据框中的行之间进行选择
【发布时间】:2017-11-25 23:57:02
【问题描述】:

我正在处理一个相当嘈杂的数据集,我想知道是否有一种好方法可以选择性地在组内的两行数据之间进行选择或不理会它们。从逻辑上讲,我想按组进行过滤,然后构建一个 if-else 类型的控制结构来根据第二列的值比较行。

例子:

Row ID  V1  V2  
1   1  blah 1.2 
2   1  blah NA 
3   2  foo  2.3 
4   3  bar  NA
5   3  bar  NA

我想按 ID (1, 2, 3) 分组,然后转到 V2 列并选择例如第 1 行而不是第 2 行,因为第 2 行有 NA。但是对于第 4 行和第 5 行,两者都是“NA”,我想不理会它们。

谢谢,

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    你需要什么可能真的取决于你到底有什么。如果是 NA,这可能会有所帮助:

    df <- data.frame(
      Row = c(1, 2, 3, 4, 5),
      ID =  c(1, 1, 2, 3, 3),
      V1 = c("bla", "bla", "foo", "bla", "bla"),
      V2 = c(1.2, NA, 2.3, NA, NA), 
      stringsAsFactors = FALSE)
    df <- df[complete.cases(df), ]
    

    【讨论】:

    • 我认为这不起作用,因为它只会删除所有包含任何 NA 的行。我不想这样做,我想在 V2 中选择一个具有非 NA 结果的行,或者如果 V2 只有该 ID 组的 NA 结果,则保留它们。
    • 看看is.na。如果您需要进一步的帮助,请提供预期结果的示例。
    【解决方案2】:

    使用purrr 的解决方案。这个想法是通过ID split 数据框。之后,应用一个用户定义的函数,它评估V2 中的所有元素是否都是NA。如果TRUE,则返回原始数据帧,否则通过使用na.omit 过滤掉带有NA 的行来返回数据帧的子集。 map_dfrlapply 类似,但它可以自动将所有数据框合并到一个列表中。 dt2 是最终输出。

    library(purrr)
    
    dt2 <- dt %>%
      split(.$ID) %>%
      map_dfr(function(x){
        if(all(is.na(x$V2))){
          return(x)
        } else {
          return(na.omit(x))
        }
      })
    dt2
    #   Row ID   V1  V2
    # 1   1  1 blah 1.2
    # 2   3  2  foo 2.3
    # 3   4  3  bar  NA
    # 4   5  3  bar  NA
    

    数据

    dt <- read.table(text = "Row ID  V1  V2  
    1   1  blah 1.2 
    2   1  blah NA 
    3   2  foo  2.3 
    4   3  bar  NA
    5   3  bar  NA",
                     header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多