基于多个动态条件过滤数据帧,这取决于数据的一个子集,例如。通过应用循环
filter data frame based on multiple dynamic conditons, which depend on a subset of the data, eg. via applying a loop
我的数据框有数百个名称,每个名称有数百个值。现在我想根据仅应用于数据的某个子集的一些数学规则过滤一些值。一个简化的示例将过滤每个名称的最大值。
我可以如下所示对其进行硬编码,但很想避免它。
library(dplyr)
##
names <- c('A', 'A', 'B', 'B')
values <- c(1,2,3,4)
df <- data.frame(names, values)
##
df%>%filter(names!='A' | values!=max(subset(df, names =='A')$values)
,names!='B' | values!=max(subset(df, names =='B')$values))
期望的输出:
names values
1 A 1
2 B 3
我会考虑在 dplyr 过滤器中创建一个循环,计算每个名称的最大值,然后在过滤器中应用两个条件(如果可能)。
过滤掉每个名字的最大值:
df %>%
group_by(names) %>%
filter(values != max(values))
# # A tibble: 2 x 2
# # Groups: names [2]
# names values
# <chr> <dbl>
# 1 A 1
# 2 B 3
或者,如果您的意思是从整个数据框中删除每个名称的最大值,只要它们出现:
df %>%
group_by(names) %>%
slice_max(values) %>%
select(values) %>%
anti_join(df, ., by = "values")
# # A tibble: 2 x 2
# # Groups: names [2]
# names values
# <chr> <dbl>
# 1 A 1
# 2 B 3
base R
中的选项
subset(df, values != ave(values, names, FUN = max))
我的数据框有数百个名称,每个名称有数百个值。现在我想根据仅应用于数据的某个子集的一些数学规则过滤一些值。一个简化的示例将过滤每个名称的最大值。
我可以如下所示对其进行硬编码,但很想避免它。
library(dplyr)
##
names <- c('A', 'A', 'B', 'B')
values <- c(1,2,3,4)
df <- data.frame(names, values)
##
df%>%filter(names!='A' | values!=max(subset(df, names =='A')$values)
,names!='B' | values!=max(subset(df, names =='B')$values))
期望的输出:
names values
1 A 1
2 B 3
我会考虑在 dplyr 过滤器中创建一个循环,计算每个名称的最大值,然后在过滤器中应用两个条件(如果可能)。
过滤掉每个名字的最大值:
df %>%
group_by(names) %>%
filter(values != max(values))
# # A tibble: 2 x 2
# # Groups: names [2]
# names values
# <chr> <dbl>
# 1 A 1
# 2 B 3
或者,如果您的意思是从整个数据框中删除每个名称的最大值,只要它们出现:
df %>%
group_by(names) %>%
slice_max(values) %>%
select(values) %>%
anti_join(df, ., by = "values")
# # A tibble: 2 x 2
# # Groups: names [2]
# names values
# <chr> <dbl>
# 1 A 1
# 2 B 3
base R
subset(df, values != ave(values, names, FUN = max))