关联R中一列与另一列的子组最大值

  • 本文关键字:一列 最大值 关联 max
  • 更新时间 :
  • 英文 :


我是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。

编辑:我需要做的第二部分(也是最后一部分)是(根据我现在所拥有的)生成一个三列数据集,该数据集在每行中指定来自x县的论文在y县的总发行量,其中"来自x县的论文"定义为"x县最多的所有论文"。

如果您不关心出现哪个关系,则使用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])

从eddi的答案出发,但采用新的方法

这个问题有一个简单的三步方法:

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)

另一种方法是使用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表示要筛选的countyID。

最新更新