0

我是 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 县是 max.county 的所有论文”。

4

3 回答 3

1

如果您不在乎出现哪一个关系,那么使用which.maxwhich 将选择第一个:

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])
于 2013-05-22T16:57:28.563 回答
0

离开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)
于 2013-05-22T19:18:52.387 回答
0

另一种方法是使用 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。

于 2015-03-23T17:22:08.240 回答