我有一个包含多行和多列的数据集,我希望通过在少数情况下忽略一列中的NA并在少数情况下包含NA来提取唯一行。请看下面的详细内容
dataset_A
e_id age fn ln custom_id
e1234 23 sur bab 1344789
e1234 23 sur bab 1344789
e1234 23 sur bab 1617
e1234 23 sur bab NA
e2345 22 nav kum NA
e2345 22 nav kum 52109
e2345 22 nav kum NA
e3456 21 ash kuma NA
e3456 21 ash kuma NA
e4567 23 anu kot NAExpected_output
e_id age fn ln custom_id
e1234 23 sur bab 1344789
e1234 23 sur bab 1617
e2345 22 nav kum 52109
e3456 21 ash kuma NA
e4567 23 anu kot NA基本上,如果e_id _id存在于该自定义列中,我希望忽略custom_id中带有NA的行,而如果用户在custom_id列中只有NA值,我希望保留一行并忽略其他行。
已尝试:
final_output = dataset_A[order(dataset_A$custom_id),]
final_output = final_output[!duplicated(final_output[,c(1:4)]),]使用上面的代码,我无法从我的数据集中提取一些行,比如1617 custom_id for e_1234 e_id。如果我们能够找到同样的解决方案,那将是非常有帮助的。
发布于 2019-01-22 17:10:35
我们可以从dplyr grouping by e_id中使用slice,如果custom_id的NA值为NA,则只返回第一行,否则返回所有非NA行,然后应用distinct来获得唯一行。
library(dplyr)
df %>%
group_by(e_id) %>%
slice(if(all(is.na(custom_id))) 1 else which(!is.na(custom_id))) %>%
distinct()
# e_id age fn ln custom_id
# <fct> <int> <fct> <fct> <int>
#1 e1234 23 sur bab 1344789
#2 e1234 23 sur bab 1617
#3 e2345 22 nav kum 52109
#4 e3456 21 ash kuma NA
#5 e4567 23 anu kot NA也许我把基本R方法过于复杂了,但是使用ave的一种方法将是
unique(df[with(df, ave(is.na(custom_id), e_id, FUN = function(x)
if (all(x)) c(TRUE, rep(FALSE, length(x) - 1)) else
replace(rep(TRUE, length(x)), x, FALSE))), ])
# e_id age fn ln custom_id
#1 e1234 23 sur bab 1344789
#3 e1234 23 sur bab 1617
#6 e2345 22 nav kum 52109
#8 e3456 21 ash kuma NA
#10 e4567 23 anu kot NA发布于 2019-01-22 17:19:06
如果理解正确,您可以按如下方式使用dplyr:
library(dplyr)
data %>% filter (., is.na(custom_id)==FALSE) %>% distinct(.)如果要保留can,可以将If else添加到slice命令中
Book2 %>% group_by(., e_id) %>%
slice(., ifelse(all(is.na(custom_id)), 1 , which(!is.na(custom_id))))编辑:有人比我快,所以请转到上一个答案
https://stackoverflow.com/questions/54304616
复制相似问题