【问题标题】:How to get rows with specific condition?如何获取具有特定条件的行?
【发布时间】:2019-11-26 15:00:28
【问题描述】:

我有一个如下所示的数据集:

data <- tribble(
  ~cat_id,   ~clicks,     ~price,
  "1",         NA,           1.2,
  "1",         T,           1.4,         
  "1",         F,           2.2,
  "2",         F,           2.2, 
  "2",         T,           1.5,
  "2",        NA,           1.6,
  "3",         T,           1.7,
  "3",         F,           1.9,
  "4",         F,           1.4,
)

但是现在,如果“click”只有“F”值,我想获取行。我想要的数据是这样的:

desired_data <- tribble(
  ~cat_id,   ~clicks,     ~price,
  "4",         F,           1.4,
)

为了得到它,我这样编码,但效果不佳:

data %>% 
  filter(clicks == "F" & clicks != "T" & clicks != "NA")

你知道我做错了什么吗?

提前致谢。

【问题讨论】:

  • 如果您至少可以让我知道您为什么对这个问题投反对票,那就太好了,因为我不知道......
  • 您是说您不想要第 3 行,例如因为第 1 行和第 2 行的点击次数 = F 和点击次数 = na?你不清楚这一点。您在这里的选择是将您的过滤器更改为all(clicks == F),然后使用 group_by id
  • @zineda,我编辑了我的答案以获得您的预期输出
  • 逻辑值是它们自己的数据类型,而不仅仅是字符串。 T(或者更好的是,TRUE)!= "T"NA 也是如此——它有实际意义,不仅仅是字母 "NA"。我猜不赞成票是因为没有进行基础研究,包括只查看数据框中的值类型
  • 目前还不清楚您要做什么。 filter 是按行发生的,所以除了我已经提到的错字之外,如果您尝试按组 ID 做某事,您还没有编写处理组的代码,也没有描述它。 “效果不佳”并不能清楚地解释您要寻求帮助的内容。

标签: r dplyr


【解决方案1】:

使用dplyr,您可以使用计数计算每个cat_id 的级别数,然后过滤同时为clicks -- Fn == 1 的行。

data %>% group_by(cat_id) %>% add_tally() %>% filter(., clicks == F & n ==1)

# A tibble: 1 x 4
# Groups:   cat_id [1]
  cat_id clicks price     n
  <chr>  <lgl>  <dbl> <int>
1 4      FALSE    1.4     1

【讨论】:

  • 但是如果还有 TRUE 或 NA 值,我可能会得到 cat_id。
  • 对不起,我没听懂?你在找什么 ?在您的问题中,您想获得点击次数 == F 的行,对吗?
  • 我已经提到了我想要的数据集。不仅是 clicks == F,如果 clicks 中有其他值(例如 TRUE 或 NA),其他值也应该存在。
【解决方案2】:

@dc37 在编辑方面领先于我

您的回答被否决了,因为人们不理解您的措辞。我猜您的意思是某些行无效,因为它们具有相同 ID 的 T 或 NA。

data  %>% group_by(., cat_id)%>% filter(., all(clicks == F))

【讨论】:

    【解决方案3】:

    这就是你要找的吗?

    data %>%
      group_by(cat_id) %>%
      filter(!any(clicks)) %>% 
      ungroup()
    

    编辑:如果点击是一个因素

    data <- tribble(
      ~cat_id,   ~clicks,     ~price,
      "1",         NA,           1.2,
      "1",         T,           1.4,         
      "1",         F,           2.2,
      "2",         F,           2.2, 
      "2",         T,           1.5,
      "2",        NA,           1.6,
      "3",         T,           1.7,
      "3",         F,           1.9,
      "4",         F,           1.4,
    )
    
    data$clicks <- factor(data$clicks, labels = c("F", "T"))
    
    data %>%
      group_by(cat_id) %>%
      filter(all(clicks == "F")) %>% 
      ungroup()
    

    【讨论】:

    • 嗨,我收到了这个错误:'any' 对因素没有意义
    • 在您的示例数据点击中是一个逻辑列。您会收到该错误,因为在您的实际数据中,点击是一个因素。看看我的编辑
    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 2023-03-05
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2022-06-25
    相关资源
    最近更新 更多