我是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是最大县”。答案 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。