【问题标题】:Identify values within group_by and mutate识别 group_by 和 mutate 中的值
【发布时间】:2021-05-24 04:57:42
【问题描述】:

尝试的问题是按 A 列分组,如果 B 列中的任何值超过 100,则为组中的每一行创建一个标志。示例表如下所示-

Column A Column B
NYC 95
NYC 98
BOS 88
BOS 101
BOS 67
MIA 90

而结果 df 看起来像这样-

Column A Column B fg
NYC 95
NYC 98
BOS 88 1
BOS 101 1
BOS 67 1
MIA 90

即使其中一个值超过 100,我也希望 fg 列为所有行返回 1。

尝试的代码如下-

df %>% group_by(Column A) %>% mutate(fg = ifelse(Column B >= 100 ,1, ''))

但这似乎出错了。还有什么方法可以用?

【问题讨论】:

  • columnB 是一个向量,而 100 是一个标量。为了将其与标量向量匹配,需要将其转换为标量,因此请使用max(columnB),它返回要匹配的标量。使用这个df %>% group_by(Column A) %>% mutate(fg = ifelse(max(Column B) >= 100 ,1, ''))

标签: r dplyr


【解决方案1】:

你可以试试-

library(dplyr)

df %>% 
  group_by(ColumnA) %>% 
  mutate(fg = as.integer(any(ColumnB >= 100))) %>%
  ungroup

#  ColumnA ColumnB    fg
#  <chr>     <int> <int>
#1 NYC          95     0
#2 NYC          98     0
#3 BOS          88     1
#4 BOS         101     1
#5 BOS          67     1
#6 MIA          90     0

同样可以写在base R和data.table中-

#Data.table
library(data.table)
setDT(df)[, fg := as.integer(any(ColumnB >= 100)), ColumnA]

#Base R
df <- transform(df, fg = as.integer(ave(ColumnB >= 100, ColumnA, FUN = any)))

【讨论】:

    【解决方案2】:

    你的语法逻辑完全没问题。但是,导致问题的原因是数据框的结构不应该有字符串,其间有空格作为变量 例如“Column B”,应重命名为“Column.B”或“Column_B”

    修复列名后,这项工作非常好

    library(dplyr)
    df %>% group_by(Column.A) %>% mutate(fg = ifelse(Column.B >= 100 ,1, 0)) 
    
    
      Column.A Column.B    fg
      <chr>       <dbl> <dbl>
    1 NYC            95     0
    2 NYC            98     0
    3 BOS            88     0
    4 BOS           101     1
    5 BOS            67     0
    6 MIA            90     0
    

    【讨论】:

      【解决方案3】:

      我们可以使用case_whenany

      library(dplyr)
      df %>% 
        group_by(Column.A) %>% 
        dplyr::mutate(flag_over100 = case_when(any(Column.B > 100, na.rm = TRUE) ~ 1,
                                        TRUE ~ 0))
      

      输出:

        Column.A Column.B flag_over100
        <chr>       <int>        <dbl>
      1 NYC            95            0
      2 NYC            98            0
      3 BOS            88            1
      4 BOS           101            1
      5 BOS            67            1
      6 MIA            90            0
      

      【讨论】:

        猜你喜欢
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 2019-04-15
        相关资源
        最近更新 更多