2016-04-25 76 views
0

我有一个数据框,它的列中有一个人(pid)和位置列。我试图对数据进行子集划分,以便当人员ID发生超过67次时,我根据个人实例发生的位置获取数据的子集,然后对该子集运行一系列回归。我知道如何让每个打到67个门槛的人(使用table()来获得每个pid的数量),但是如何根据他们的位置得到数据框的一个子集,而不知道这个位置是什么?数据框大约有100,000行,400人击中67分,因此手动操作似乎并不实际。故障子集r数据帧

我不知道如何把我的数据的样本数据集放在这里,但它看起来像这样。因此,例如,如果pid值1重复200次,我希望将位置值为'6'的所有数据框都分组,而不管pid。类似于pid 3 - 我想要位置为'1'的所有行。唯一的问题是,有时一个pid会有多个位置。大多数将在一个特定的位置 - 所以与3号,有位置1和位置2.在这种情况下,我想要子集的位置占多数。

pid  location 
1  6 
1  6 
1  6 
2  4 
2  6 
3  1 
3  2 
3  1 

样本数据

set.seed(1) 
pid <- sample(1:10, 1000, replace=T) 
location <- sample(1:10, replace=T) 
df <- data.frame(pid, location) 

编辑: 好 - 我想要做的就是让每一个的Pid是重复超过66倍。一旦我有了这个列表,我想知道他们发生了什么位置。然后,我想在整个数据框的位置子集上运行一系列回归。因此 - 如果Pid 1发生500次,并且它们发生在位置6中,我想为位置6的数据集进行子集化,为Pid 1创建一个虚拟变量并在位置6的子集上运行一堆回归(其他回归变量不包括在内在这个例子中)。数据框中有1272个唯一的Pid。我能够使用Ano的答案来获得我正在寻找的东西,但最后我做了一些改变。对于我来说,首先按位置对数据进行分组,然后获得重复超过66次的Pid并运行我的回归,似乎更容易(至少在概念上)。这消除了对具有多个位置的Pid's的任何担忧。但是对于r来说,这是一个很新的东西,我愿意接受其他关于什么是更好的编码方式的建议。 希望这个澄清一点。

+1

你应该说明你想要的输出是什么样的。 – Frank

+0

等待 - 我知道我是新来的stackoverflow,但为什么一个帖子被搁置后,答案已被接受?现在编辑帖子,希望能让它更容易理解。 – MikeD

+2

你有五个答案,其中三个被他们的作者删除,因为他们意识到他们不知道你在做什么。被接受的答案正确地猜出你的意图并不能改善这方面的问题。也许它应该重新打开,因为你已经添加了更多的文本,但我没有看到这一点。我想说的是,只要你下一次提出问题就会变得更清楚。 – Frank

回答

1

此解决方案使用dplyr

library(dplyr) 

集团通过PID数据,计算有多少实例是PID的,过滤掉那些达到什么门槛,你有兴趣,然后选择选择不同的PID

foo <- df %>% 
    group_by(pid) %>% 
    filter(n() >= 67 & max(n() == n())) %>% 
    distinct(pid) %>% 
    .$pid 

使用新生成的矢量子集原始的数据框,选择独特的location小号

unique(df[df$pid %in% foo,"location"]) 
+0

对于第二部分,他们只希望每个pid有一个位置,听起来像。 – Frank

+1

明白了。添加一个'filter(count == max(count))',我认为应该这样做 – ano

+1

不需要mutate,我们可以将过滤器放在一起,最后2行可以用'。$ pid'替换... – zx8754

0

这里是无需使用可能性210:

df.freq <- addmargins(table(df), margin = 2) 
df.freq <- subset(df.freq, 'Sum' > 67, select = -Sum) 

df.max <- apply(df.freq, 1, function(x) { 
    names(x)[which(x == max(x))] }) 
df.max <- unique(as.numeric(df.max)) 
subset(df, location %in% df.max)