将一列中子组的最大值与 R 中的另一列相关联
Posted
技术标签:
【中文标题】将一列中子组的最大值与 R 中的另一列相关联【英文标题】:Associating the Maximum of Subgroups in One Column with Another Column in R 【发布时间】:2013-05-17 19:45:49 【问题描述】:我是 R 的初级用户,我正在研究一项让我有些难过的任务。我有一个数据集,其中一列列出了数千份(本地)报纸的标题,另外两列列出了报纸总部附近县的报纸发行量(使用每个县的唯一县 ID 而不是潜在的非唯一县名)。
因此,有时一份报纸占据五行或更少,有时甚至十行或更多,这取决于周边县的发行量。我需要做的是将给定论文的发行量最高的县的县 ID 与与该论文对应的所有行相关联。也就是以三份在相似地区流通的报纸为例,
Paper CountyID Circulation MaxCountyID
Times 1 1000 2
Times 2 2000 2
Times 3 500 2
Chronicle 1 5000 1
Chronicle 2 4000 1
Chronicle 3 1000 1
Tribune 1 900 1
Tribune 3 700 1
虽然在实际数据集中发行量自然远小于这个值,但考虑到它的庞大规模,我预计至少在几个情况下我会遇到最高发行量,所以我认为我需要以某种方式处理这种可能性;任何绑定的县都可以显示为 MaxCounty。
编辑:我需要做的第二部分也是最后一部分是(根据我现在所拥有的)生成一个三列数据集,该数据集在每一行中指定 y 县的论文总发行量来自 x 县,其中“来自 x 县的论文”被定义为“所有 x 县是 max.county 的论文”。
【问题讨论】:
【参考方案1】:如果您不关心出现哪一个关系,请使用which.max
,它将选择第一个:
library(data.table)
dt = data.table(paper = c("A","A","A","B","B","B"), county = c(1:3), circulation = c(10,20,20,10,20,30))
dt[, max.county := county[which.max(circulation)], by = paper]
dt
# paper county circulation max.county
#1: A 1 10 2
#2: A 2 20 2
#3: A 3 20 2
#4: B 1 10 3
#5: B 2 20 3
#6: B 3 30 3
您也可以将它们全部保存在一个列表中,或随机选择:
dt[, max.county := NULL]
dt[, max.county := list(list(county[circulation == max(circulation)])), by = paper]
dt[, max.county := NULL]
dt[, max.county := sample(as.list(county[circulation == max(circulation)]), 1), by = paper])
【讨论】:
谢谢。但是,我收到一条错误消息:“unused argument(s) (by = paper)” 您可能忘记将数据转换为data.table
,即dt = data.table(your_data_frame)
确实你是对的。谢谢你陪我!我需要做的第二个也是最后一个部分是(根据我现在所拥有的)生成一个三列数据集,该数据集在每一行中指定来自 x 县的论文在 y 县的总发行量,其中“来自 x 县的论文”被定义为“x 县是 max.county 的所有论文”。有什么潜在的建议吗?顺便说一句,我是***的新手,所以我不完全确定询问后续行动的首选方法;也许我也应该将其编辑到最初的问题中。
@BrianWheaton - 恐怕我不明白,你应该发布一个开始和结束数据的例子,并解释你是如何到达那里的【参考方案2】:
偏离 eddi 的答案,但采用新方法
这个问题有一个简单的 3 步方法:
1、创建一个变量A,存储每篇论文的最大流通量值
a<- aggregate(dt$circulation, by=list(paper=dt$paper), FUN= max)
2,在您的数据库中找到与每篇论文的最大值相对应的县。这只会为每个最大值创建一行, 即使你有领带。将 b 修剪为两列。
b<- dt[dt$paper== a$paper & dt$circulation == a$x, ]
b<- b[,2:3]
3.合并两张表(左外连接)
merge(x=dt, y=b, by= "paper", all.x=TRUE)
【讨论】:
感谢您的帮助。尝试步骤 2 的第一部分时,我收到一条错误消息。“警告消息:1:在 dt$paper == a$paper 中:较长的对象长度不是较短对象长度的倍数 2:在 dt$circulation == a $x : 较长的对象长度不是较短对象长度的倍数"【参考方案3】:另一种方法是使用 dplyr 包。
library(dplyr)
dt %>% group_by(COUNTY_ID) %>% mutate(MaxCountyID = max(Circulation))
上面的行会将列 MaxCountyID 添加到 dt。如果您想过滤以查看某个县最大的所有报纸,您可以将上述内容扩展到以下内容。
dt %>% group_by(County_ID) %>% mutate(MaxCountyID = max(Circulation)) %>% filter(MaxCountyID == 2)
在上面,2 代表您要过滤到的县 ID。
【讨论】:
以上是关于将一列中子组的最大值与 R 中的另一列相关联的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Access 2016 中的另一列上选择具有最大值的不同行