在数据框中的行之间进行选择

时间:2017-11-25 23:57:03

标签: r dataframe dplyr

我正在处理一个相当嘈杂的数据集,我想知道是否有一种很好的方法可以有选择地在一组中的两行数据之间进行选择,或者让它们独自存在。逻辑方面我想按组过滤,然后构建一个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”和“#”;我想让他们独自一人。

谢谢,

1 个答案:

答案 0 :(得分:0)

使用purrr的解决方案。我们的想法是split数据框ID。之后,应用用户定义的函数,该函数评估V2中的所有元素是否为NA。如果TRUE,则返回原始数据框,否则通过使用NA过滤掉na.omit的行来返回数据框的子集。 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)