麻烦子集 r 数据帧

trouble subsetting r data frame

我有一个数据框,它的列中有一个人 (pid) 和位置列。我正在尝试对数据进行子集化,以便当一个人的 ID 出现超过 67 次时,我会根据该人的实例出现的位置获取数据的一个子集,然后 运行 对该子集进行一系列回归。

我知道如何获取达到 67 阈值的每个人(使用 table() 获取每个 pid 的计数),但是我如何根据他们的位置获取数据框的子集不知道位置是什么?数据框大约有 100,000 行,其中 400 人达到了 67 分,因此手动完成似乎不切实际。

我不知道如何将我的数据的示例数据集放在这里,但它看起来像这样。因此,例如,如果 pid 值 1 重复 200 次,我想对所有位置值为“6”的数据帧进行子集化,而不考虑 pid。类似于 pid 3 - 我想要位置为“1”的所有行。唯一的问题是有时一个 pid 会有多个位置。大多数将位于一个特定位置 - 因此对于 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)

编辑: 好的 - 我想要做的是让每个重复超过 66 次的 Pid。获得该列表后,我想查看它们发生的位置。然后,我想 运行 对整个数据框的位置子集进行一系列回归。所以 - 如果 Pid 1 出现 500 次,并且它们出现在位置 6,我想为位置 6 的数据帧子集,为 Pid 1 创建一个虚拟变量和 运行 在位置 6 的那个子集上的一堆回归(其他此样本中未包含的回归变量)。 dataframe 中有 1272 个唯一的 Pid。我能够使用 Ano 的答案来获得我想要的东西,但最后我做了一些不同的事情。首先按位置对数据进行子集化似乎更容易(至少在概念上对我而言),然后获取重复超过 66 次的 Pid 和 运行 我的回归。这消除了对具有多个位置的 Pid 的任何担忧。但作为 r 的新手,我愿意接受其他关于更好的编码方式的建议。 希望这能澄清一点。

此解决方案使用 dplyr

library(dplyr)

按 PID 对数据进行分组,计算该 PID 的实例数量,过滤掉达到您感兴趣的任何阈值的实例,然后 select select 不同的 PID

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

使用新生成的向量对原始数据帧和 select 唯一的 locations

进行子集化
unique(df[df$pid %in% foo,"location"])

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

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)