将一列中子组的最大值与 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 中的另一列上选择具有最大值的不同行

Pandas:创建新列,其中包含按组列出的另一列中最大值的对应值

创建唯一项目的 df 和每个唯一项目的另一列的最大值

如何使用熊猫将一列移动到除标题之外的另一列[重复]

Sql语句查询某列A相同值的另一列B最大值的数据

如何根据另一列值将一列分成多个?