首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过忽略R中的NA来提取唯一行

如何通过忽略R中的NA来提取唯一行
EN

Stack Overflow用户
提问于 2019-01-22 17:02:45
回答 2查看 1.2K关注 0票数 1

我有一个包含多行和多列的数据集,我希望通过在少数情况下忽略一列中的NA并在少数情况下包含NA来提取唯一行。请看下面的详细内容

dataset_A

代码语言:javascript
复制
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    NA

Expected_output

代码语言:javascript
复制
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值,我希望保留一行并忽略其他行。

已尝试:

代码语言:javascript
复制
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。如果我们能够找到同样的解决方案,那将是非常有帮助的。

EN

回答 2

Stack Overflow用户

发布于 2019-01-22 17:10:35

我们可以从dplyr grouping by e_id中使用slice,如果custom_id的NA值为NA,则只返回第一行,否则返回所有非NA行,然后应用distinct来获得唯一行。

代码语言:javascript
复制
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的一种方法将是

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2019-01-22 17:19:06

如果理解正确,您可以按如下方式使用dplyr:

代码语言:javascript
复制
library(dplyr)
data %>% filter (., is.na(custom_id)==FALSE) %>% distinct(.)

如果要保留can,可以将If else添加到slice命令中

代码语言:javascript
复制
Book2 %>%  group_by(., e_id) %>%
  slice(., ifelse(all(is.na(custom_id)), 1 , which(!is.na(custom_id))))

编辑:有人比我快,所以请转到上一个答案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54304616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档