繁体   English   中英

R — 识别 group_by 中的值并进行变异

[英]R — Identify values within group_by and mutate

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

A栏 B栏
纽约市 95
纽约市 98
操作系统 88
操作系统 101
操作系统 67
米娅 90

并且得到的 df 看起来像这样 -

A栏 B栏 fg
纽约市 95
纽约市 98
操作系统 88 1
操作系统 101 1
操作系统 67 1
米娅 90

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

尝试的代码如下 -

df %>% group_by(Column A) %>% mutate(fg = ifelse(Column B >= 100,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

同样可以写在基础 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)))

你的语法逻辑完全没问题。 但是,导致问题的原因是 dataframe 的结构不应该有字符串之间有空格作为变量,例如“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

我们可以将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))

Output:

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM