替换 dplyr R 中的循环

Replacing loop in dplyr R

所以我正在尝试使用没有循环的 dplyr 编写函数,但我不知道该怎么做

假设我们有电视台 (x,y,z) 和月份 (2,3)。如果我按这个分组,我们得到 此输出还带有汇总数值

TV  months  value

x    2      52
y    2      87
z    2      65
x    3      180
y    3       36
z    3       99

这是评估品牌。

然后我将有许多品牌需要过滤以仅获得价值 >=0.8* 评估品牌价值 & <=1.2* 评估品牌价值的品牌

因此,例如从下面开始,我只想过滤前两个,并且应该对所有月份和电视组合都这样做

brand  TV MONTH value

sdg     x  2     60
sdfg    x  2     55
shs     x  2     120
sdg     x  2     11
sdga    x  2     5000

正如@akrun 所说,您需要结合使用合并和子集。这是基本的 R 解决方案。

m <- merge(df, data, by.x=c("TV", "MONTH"), by.y=c("TV", "months"))
m[m$value.x >= m$value.y*0.8 & m$value.x <= m$value.y*1.2,][,-5]
#  TV MONTH brand value.x
#1  x     2   sdg      60
#2  x     2  sdfg      55

数据

data <- structure(list(TV = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("x", 
"y", "z"), class = "factor"), months = c(2L, 2L, 2L, 3L, 3L, 
3L), value = c(52L, 87L, 65L, 180L, 36L, 99L)), .Names = c("TV", 
"months", "value"), class = "data.frame", row.names = c(NA, -6L
))

df <- structure(list(brand = structure(c(2L, 1L, 4L, 2L, 3L), .Label = c("sdfg", 
"sdg", "sdga", "shs"), class = "factor"), TV = structure(c(1L, 
1L, 1L, 1L, 1L), .Label = "x", class = "factor"), MONTH = c(2L, 
2L, 2L, 2L, 2L), value = c(60L, 55L, 120L, 11L, 5000L)), .Names = c("brand", 
"TV", "MONTH", "value"), class = "data.frame", row.names = c(NA, 
-5L))