子集基于行中的重复值和R中的条件列?

时间:2015-05-27 22:43:41

标签: r

我有一系列广告系列投放数据。我想提取在2008年和2012年贡献的贡献者,同时保持选举类型 - 我不想删除这些年前的字母 - P和G.例如,注意AARONSON PAUL如何在P2008,G2008中做出贡献和G2012:

cand_nm party_id    contbr_nm       contb_receipt_amt   election_tp
Obama Barack    D   AARONSON PAUL       250 P2008
Obama Barack    D   AARONSON PAUL       100 G2008
Obama Barack    D   AARONSON PAUL       500 G2008
Obama Barack    D   AARONSON PAUL       500 G2008
Obama Barack    D   AARONSON PAUL       500 G2012
Obama Barack    D   AARONSON PAUL       281 G2012
Obama Barack    D   AARONSON PAUL       219 G2012

我想提取像这样的贡献者。我的数据集最初是两个:8和12之前我将它们合并为1.所以我知道在2008年贡献的21.6%,因为:2012年贡献了:

length(unique(data$contbr_nm)) = 192022

length(unique(eight$contbr_nm)) = 123792

length(unique(twelve$contbr_nm)) = 95005

((123792+95005)-192022)/(123792) = 0.2162902

但是我如何实际上对这些贡献者进行子集化。我觉得应该有办法用ddply或sqldf做到这一点。

3 个答案:

答案 0 :(得分:2)

以下是使用dplyrtidyr包的方法:

library(dplyr)
library(tidyr)

data %>%
  mutate(year = extract_numeric(election_tp)) %>%
  group_by(contbr_nm) %>%
  filter(n_distinct(year) == 2)

它创建一个仅包含年份值的新变量,然后仅针对具有该新变量的两个不同值的贡献者进行过滤。

答案 1 :(得分:0)

我创建了一个显示包含/排除

的快速示例
library(data.table)

data <- data.table(year = c("P2008","G2008","G2012", "G2008", "G2012"), name = c("x","x","x","yy","zz"), rnd = runif(5))
# You should use data <- data.table(data) here

setkey(data,name)

data[name == unique(merge(data[substr(year,2,5) == "2008"],data[substr(year,2,5) == "2012"])[["name"]])]

打破这种局面,我内心地加入了所有2008年价值的数据表,其中包含2012年的所有价值,这些价值会返回每年存在的所有名称。然后我删除重复项,并将我的初始data.table与此唯一列表中的名称进行子集化。

答案 2 :(得分:0)

如果你提供样本输出会更清楚,但假设你想列出2008年和2012年贡献者的贡献:

sqldf SQL支持$(function(){ var network = $('.social-networks li a'), animateTime = 75, navLink = $('.social-networks li a'); navLink.hover(function(){ var $this = $(this); if($this.width() === 32){ autoWidthAnimate($this, animateTime); } else { $this.stop().animate({ width: '32' }, animateTime); } }); }) function autoWidthAnimate(element, time){ var curWidth = element.width(), // Get default width autoWidth = element.css('width', 'auto').width(); // Get auto width element.width(curWidth); // Reset to default width element.stop().animate({ width: autoWidth }, parseInt(time)); // Animate to auto width } 其中like是通配符:

%

,并提供:

library(sqldf)
sqldf("select distinct contbr_nm 
       from (select contbr_nm from DF where election_tp like '%2008')
       join (select contbr_nm from DF where election_tp like '%2012')
       using (contbr_nm)")

grepl / intersect / subset 这也可以使用 contbr_nm 1 AARONSON PAUL intersectgrepl来完成。没有使用包裹:

subset

注意在上文中,我们将其用作intersect(subset(DF, grepl('2008', election_tp))$contbr_nm, subset(DF, grepl('2008', election_tp))$contbr_nm)

DF