首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >故障减法r数据帧

故障减法r数据帧
EN

Stack Overflow用户
提问于 2016-04-25 20:12:49
回答 2查看 186关注 0票数 0

我有一个数据框架,其中的列是person (pid)和location列。我正在尝试对数据进行子集,以便当人员ID发生超过67次时,我根据人的实例发生的位置获取数据的子集,然后在该子集上运行一系列的回归。

我知道如何让每个达到这67个阈值的人(使用table()来获取每个pid的计数),但是如何根据他们的位置不知道位置得到数据帧的子集呢?数据帧大约有100,000行,400人达到67大关,所以手工操作似乎不太现实。

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

代码语言:javascript
复制
 pid     location
 1       6
 1       6
 1       6
 2       4
 2       6
 3       1
 3       2
 3       1

样本数据

代码语言:javascript
复制
set.seed(1)
pid <- sample(1:10, 1000, replace=T)
location <- sample(1:10, replace=T)
df <- data.frame(pid, location)

编辑:好的--我要做的是得到每一个重复超过66次的Pid。一旦我有了这个列表,我想看看它们发生在什么地方。然后,我想在整个数据挖掘的一个位置子集上运行一系列的回归。因此-如果Pid 1发生了500次,并且它们发生在位置6中,我想对位置6的数据进行子集,为Pid 1创建一个虚拟变量,并在位置6的子集上运行一系列回归(此示例中没有包括其他回归变量)。数据文件中有1272个唯一的Pid。我能够用阿诺的答案来得到我想要的东西,但最终我做的有点不同。首先按位置对数据进行子集,然后获得重复次数超过66次的Pid,然后运行回归,这似乎更容易(至少对我来说是这样)。这就消除了对Pid有多个位置的担忧。但是对于r来说,我是非常新的,我愿意接受其他的建议,什么是更好的编码方法。希望这能澄清一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-25 20:29:26

此解决方案使用dplyr

代码语言:javascript
复制
library(dplyr)

按PID对数据进行分组,计算该PID的实例数,筛选出那些达到您感兴趣的阈值的实例,然后选择不同的PID。

代码语言:javascript
复制
foo <- df %>%
  group_by(pid) %>%
  filter(n() >= 67 & max(n() == n())) %>%
  distinct(pid) %>%
  .$pid

使用新生成的向量对原始数据进行子集,并选择唯一的location

代码语言:javascript
复制
unique(df[df$pid %in% foo,"location"])
票数 1
EN

Stack Overflow用户

发布于 2016-04-25 20:58:28

这里有一种不使用dplyr的可能性

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36850170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档