[英]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_when
与any
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.