如何在R中利用条件删除NAs?

3
我想根据条件删除一些行。以下是我的数据:
df_A <- tribble(
  ~product_name,   ~id,  ~clicks,
        "A",        NA,      1,  
        "A",         4,      1, 
        "A",         3,      1, 
        "B",        NA,      NA, 
        "B",         6,      2, 
        "C",        NA,      3, 
        "C",         5,      NA, 
)

例如,我想要删除第一行和第六行,因为在product_name中的产品A和C已经在id列中有了该值。但我想保留第四行,因为如果所有行(除了product_name)都是NA,则应该保留该行数据。
这是我期望得到的数据:
df_A <- tribble(
  ~product_name,   ~id,  ~clicks,
       "A",          4,      1, 
       "A",          3,      1, 
       "B",         NA,      NA, 
       "B",          6,      2, 
       "C",          5,      NA, 
)

1
如果有一行数据像这样"D", NA, 3,那么应该再有另一行数据像这样:"D", 5, 3。所以我们不保留第一个。@zx8754 - datazang
条件不是很清楚... 只是为了我自己的理解。 "删除" 的条件是:如果 id 是 NA,但 click 不是 NA,并且至少还有一行具有相同产品名称,则删除该行。这符合您的预期吗? - Marco
这个例子跟你的实际情况有多接近?比如说,你还有很多列数据吗,还是就这些? - arg0naut91
没错!@Marco - datazang
是的,我有更多的列。但它们依赖于产品名称,因此我们没有删除的其他行已经具有相同的值。@arg0naut91 - datazang
显示剩余2条评论
5个回答

3

您可以使用条件创建一个虚拟列,并过滤掉它。

df_A %>%
  mutate(
    not_remove = case_when(
      is.na(id) & is.na(clicks) ~ TRUE,
      is.na(id) ~ FALSE,
      TRUE ~ TRUE
    )
  ) %>%
  filter(not_remove) %>%
  select(
    -not_remove
  )

1
你可以将 case_when 放在 filter 内部。 - zx8754

1
df_A %>%
    group_by(product_name) %>%
    filter(!is.na(id) |
               is.na(id) & is.na(clicks))

3
我认为这个答案忽略了产品名称没有重复的要点...... 如果你添加一行代码 " "D", NA, 3, ", 这段代码也会被删除...... 根据评论我理解这不是你想要的,因为"D"作为产品名称是唯一的...... - Marco

1
这是一个使用基本R和ave函数的解决方案。
df_A_out <- subset(df_A,!(!!ave(id,product_name,FUN = function(x) sum(!is.na(x))>0) & is.na(id) & !is.na(clicks)))

1
然后这应该是答案:
df_A <- df_A[!((duplicated(df_A$product_name) | duplicated(df_A$product_name, fromLast=TRUE)) & is.na(df_A$id) & !is.na(df_A$clicks)),]

1

由于您有特定的条件来过滤NAs,所以我使用了if和for循环。 希望这可以帮助。

for(i in 1:nrow(df_A)){
  if(!is.na(df_A$product_name[i]) & is.na(df_A$id[i]) & is.na(df_A$clicks[i]))
    df_A[i,]<-df_A[i,]
  else if(is.na(df_A$id[i]))
    df_A<-df_A[-i,]
}  

输出:

输出图像


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接