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