我正在处理一个相当嘈杂的数据集,我想知道是否有一种很好的方法可以有选择地在一组中的两行数据之间进行选择,或者让它们独自存在。逻辑方面我想按组过滤,然后构建一个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”和“#”;我想让他们独自一人。
谢谢,
答案 0 :(得分:0)
使用purrr
的解决方案。我们的想法是split
数据框ID
。之后,应用用户定义的函数,该函数评估V2
中的所有元素是否为NA
。如果TRUE
,则返回原始数据框,否则通过使用NA
过滤掉na.omit
的行来返回数据框的子集。 map_dfr
与lapply
类似,但它可以自动组合列表中的所有数据框。 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)