R 比较下部节点和上部节点的最大值

R 比较下部节点和上部节点的最大值,r,statistics,R,Statistics,我有一个相当复杂的问题。我有不同的公司,也有不同的买家。此外,我也有不同的产品,可以多达15种产品。 所有产品都有价格。此价格适用于不同的产品集,在我的示例中,这些产品集的名称为产品集1到产品集6 现在,我想遍历所有公司,检查他们的买家,并测试所有产品的价格是否设置为1到6(在我的示例中)是产品-所有节点上的最大值,用于选择相同的公司和买家 我举了一个例子: > dput(sys) structure(list(Company = c("Company 1", "Company 2", "

我有一个相当复杂的问题。我有不同的公司,也有不同的买家。此外,我也有不同的产品,可以多达15种产品。 所有产品都有
价格
。此
价格
适用于不同的产品集,在我的示例中,这些产品集的名称为
产品集1
产品集6

现在,我想遍历所有
公司
,检查他们的
买家
,并测试所有
产品的价格是否设置为1到6(在我的示例中)
产品-所有
节点上的最大值,用于选择相同的
公司
买家

我举了一个例子:

> dput(sys)
structure(list(Company = c("Company 1", "Company 2", "Company 3", 
"Company 2", "Company 2", "Company 2", "Company 3", "Company 3", 
"Company 5", "Company 5", "Company 5", "Company 2", "Company 2", 
"Company 2", "Company 2", "Company 2"), Buyer = c("Buyer 1", 
"Buyer 2", "Buyer 1", "Buyer 1", "Buyer 1", "Buyer 2", "Buyer 2", 
"Buyer 1", "Buyer 3", "Buyer 1", "Buyer 3", "Buyer 2", "Buyer 2", 
"Buyer 2", "Buyer 2", "Buyer 2"), Products = c("Product - ALL", 
"Product - Set 1", "Product - Set 2", "Product - Set 1", "Product - ALL", 
"Product - ALL", "Product - ALL", "Product - Set 1", "Product - ALL", 
"Product - Set 1", "Product - Set 2", "Product - Set 2", "Product - Set 3", 
"Product - Set 4", "Product - Set 5", "Product - Set 6"), Price = c(NA, 
10L, 99L, 13L, 13L, 12L, 99L, 99L, 100L, 100L, 100L, 12L, NA, 
11L, 0L, 12L)), .Names = c("Company", "Buyer", "Products", "Price"
), row.names = c(NA, -16L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x0000000000100788>)
> 
> df <- sys[ (sys$Company =="Company 2" & sys$Buyer == "Buyer 2"), ]
> 
> #replace all NAs with 0
> df[is.na(df)] <- 0
> 
> #Fill control column with null
> df$ControlColumn <- "null"
> 
> if(grep("Product - ALL", df)) {
+  i <- grep("Product - ALL", df)
+  prodSet1 <- grep("Product - Set 1", df$Products)
+  prodSet2 <- grep("Product - Set 2", df$Products)
+  prodSet3 <- grep("Product - Set 3", df$Products)
+  prodSet4 <- grep("Product - Set 4", df$Products)
+  prodSet5 <- grep("Product - Set 5", df$Products)
+  prodSet6 <- grep("Product - Set 6", df$Products)
+  val <- max(df[prodSet1]$Price, df[prodSet2]$Price,df[prodSet3]$Price,df[prodSet4]$Price,df[prodSet5]$Price,df[prodSet6]$Price)
+  df[i]$Price == val
+  df[i]$ControlColumn <- (df[i]$Price == val)
+ }
>dput(系统)
结构(列表)(公司=c(“公司1”、“公司2”、“公司3”),
“第二公司”、“第二公司”、“第二公司”、“第三公司”、“第三公司”,
“第五公司”、“第五公司”、“第五公司”、“第二公司”、“第二公司”,
“2号公司”、“2号公司”、“2号公司”),买方=c(“1号买方”,
“买方2”、“买方1”、“买方1”、“买方1”、“买方2”、“买方2”,
“买方1”、“买方3”、“买方1”、“买方3”、“买方2”、“买方2”,
“买方2”、“买方2”、“买方2”),产品=c(“产品-全部”,
“产品-集1”、“产品-集2”、“产品-集1”、“产品-全部”,
“产品-全部”、“产品-全部”、“产品集1”、“产品-全部”,
“产品集1”、“产品集2”、“产品集2”、“产品集3”,
“第四套产品”、“第五套产品”、“第六套产品”),价格=c(不适用,
10L,99L,13L,13L,12L,99L,99L,100L,100L,12L,NA,
11升、0升、12升),名称=c(“公司”、“买方”、“产品”、“价格”
),row.names=c(NA,-16L),class=c(“data.table”,“data.frame”
),.internal.selfref=)
> 
>df
>#将所有NAs替换为0
>df[is.na(df)]
>#用null填充控制列
>df$ControlColumn
>if(grep(“产品-全部”,df)){

+i您可以更好地利用以下事实:您的
sys
数据集是一个
data.table

首先,您可以为给定的
公司
买家找到价格最高的
产品
(我们不希望这些产品是
产品-所有
):

现在,所有“产品-所有”条目都可以替换为更新的条目:

result <- rbind(all.prods,sys[Products!='Product - ALL'])

谢谢您的回答!排序后,我如何显示Produc-All price是否正确地表示较低节点的聚合值?因为我的目标是检查而不是替换?我基本上想要一个列,如果计算正确,则将
Product-All
节点标记为
TRUE
。您可以尝试
sys吗[,ControlColumn:=(Products='Product-ALL'&Price==max(Price,na.rm=T)),by=.(Company,Buyer)]
看看它是否能产生您期望的结果?
all.prods <- max.prices
all.prods[,Products:='Product - ALL']
#      Company   Buyer      Products Price
# 1: Company 2 Buyer 2 Product - ALL    12
# 2: Company 3 Buyer 1 Product - ALL    99
# 3: Company 2 Buyer 1 Product - ALL    13
# 4: Company 5 Buyer 1 Product - ALL   100
# 5: Company 5 Buyer 3 Product - ALL   100
result <- rbind(all.prods,sys[Products!='Product - ALL'])
setkey(result,Company,Buyer)    
result
#      Company   Buyer        Products Price
#  1: Company 2 Buyer 1   Product - ALL    13
#  2: Company 2 Buyer 1 Product - Set 1    13
#  3: Company 2 Buyer 2   Product - ALL    12
#  4: Company 2 Buyer 2 Product - Set 1    10
#  5: Company 2 Buyer 2 Product - Set 2    12
#  6: Company 2 Buyer 2 Product - Set 3    NA
#  7: Company 2 Buyer 2 Product - Set 4    11
#  8: Company 2 Buyer 2 Product - Set 5     0
#  9: Company 2 Buyer 2 Product - Set 6    12
# 10: Company 3 Buyer 1   Product - ALL    99
# 11: Company 3 Buyer 1 Product - Set 2    99
# 12: Company 3 Buyer 1 Product - Set 1    99
# 13: Company 5 Buyer 1   Product - ALL   100
# 14: Company 5 Buyer 1 Product - Set 1   100
# 15: Company 5 Buyer 3   Product - ALL   100
# 16: Company 5 Buyer 3 Product - Set 2   100