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

时间:2013-05-22 16:36:04

标签: 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出现。

编辑:第二部分 - 也是最后一部分 - 我需要做的是(从我现在开始)生成一个三列数据集,在每行中指定文章县y的总循环量来自县x,其中“来自县x的论文”被定义为“所有论文,其中x是最大县”。

3 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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这两个表(左外连接)

merge(x=dt, y=b, by= "paper", all.x=TRUE)

答案 2 :(得分: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。