【问题标题】:Insert column based on logical conditions in R根据R中的逻辑条件插入列
【发布时间】:2020-04-17 20:34:22
【问题描述】:

我正在使用“过滤器”功能根据任一条件从我的数据中选择行:

Subset_data <- filter(Data, company_type == 3 & annualturnover %in% c(1,2,3) | company_type == 2 & annualturnover %in% c(1,2)) 

现在我想添加一列,当行满足第一个条件(company_type == 3 & Annualturnover %in% c(1,2,3))时,其值为“0”,值为“1”如果满足第二个条件(公司类型 == 2 & 年营业额 %in% c(1,2))。

我怎样才能有效地做到这一点(如果可能,不要循环)?

【问题讨论】:

  • 大概你正在使用来自dplyrfilterdplyr 添加新列的方式是 Subset_data &lt;- Subset_data %&gt;% mutate(first_cond = company_type == 3 &amp; annualturnover %in% c(1,2,3), second_cond = company_type == 2 &amp; annualturnover %in% c(1,2))
  • 我只想根据条件添加一列,其值为 0 或 1。
  • 如前所述,我想要的只是添加了 one 列 - 您的代码添加了两列“first cond”和“second cond”
  • 如果两者都没有遇到,或者两者都遇到,你想要什么? (理论上,我猜这两种公司不可能同时存在)
  • 如果两个条件都不满足,该行将不再在子集中......因为我正在使用过滤器。两个条件都满足是不会发生的

标签: r logical-operators


【解决方案1】:
library(dplyr)
Subset_data <- Data %>%
  filter(company_type == 3 & annualturnover %in% c(1,2,3) | 
           company_type == 2 & annualturnover %in% c(1,2)) %>%
  mutate(category = case_when(
    company_type == 3 & annualturnover %in% c(1,2,3) ~ 0L,
    company_type == 2 & annualturnover %in% c(1,2)   ~ 1L,
    TRUE ~ NA_integer_))

Subset_data
## A tibble: 2 x 3
#  company_type annualturnover category
#         <int>          <int>    <int>
#1            3              3        0
#2            2              2        1

使用这些虚假数据

Data <- tribble(
  ~company_type, ~annualturnover,
  1L, 2L,
  3L, 3L,
  2L, 2L,
  2L, 3L)

【讨论】:

    【解决方案2】:

    您可以简单地使用 ifelse 然后排除 NA 情况。

    dat$cat <- with(dat, ifelse(company_type == 3 & annualturnover %in% 1:3, 0,
                                ifelse(company_type == 2 & annualturnover %in% 1:2, 1, NA)))
    dat <- dat[!is.na(dat$cat), ]
    dat
    #   company_type annualturnover cat
    # 2            3              3   0
    # 3            2              2   1
    

    (使用 @JonSpring 的数据。)

    【讨论】:

      猜你喜欢
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多