2016-04-25 3 views
0

У меня есть кадр данных, который среди его столбцов является столбцом человека (pid) и местоположения. Я пытаюсь подмножить данные таким образом, что, когда идентификатор лиц встречается более 67 раз, я беру подмножество данных на основе местоположения, в котором встречаются экземпляры этого человека, а затем запускает серию регрессий в этом подмножестве.проблема подмножество r кадр данных

Я знаю, как получить всех, кто попадает в этот порог 67 (используя таблицу(), чтобы получить счетчик каждого 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) 

правок: Ok - То, что я пытаюсь сделать, это получить каждый Pid, ​​который повторяется более 66 раз. После того, как у меня есть этот список, я хочу посмотреть, в каком месте они произошли. Затем я хочу запустить кучу регрессий в подмножестве местоположения всего фрейма данных. Итак, если Pid 1 встречается 500 раз, и они произошли в местоположении 6, я хочу подмножить dataframe для местоположения 6, создать фиктивную переменную для Pid 1 и запустить кучу регрессий на этом подмножестве местоположения 6 (другие переменные регрессии не включены в этом примере). В кадре данных имеется 1272 уникальных Pid. Я смог использовать ответ от Ano, чтобы получить то, что искал, но в конце концов я сделал это немного иначе. Казалось легче (по крайней мере концептуально для меня) сначала подмножить данные по местоположению, а затем получить Pid's, которые повторяются более 66 раз и запускают мои регрессии. Это избавило вас от беспокойства о том, что Pid имеют более одного места. Но, будучи довольно новым для r, я открыт для других предложений о том, что было бы лучшим способом его кодировать. Надеюсь, это немного разъясняет это.

+1

Вы должны уточнить, как выглядит ваш желаемый результат. – Frank

+0

wait - Я знаю, что я новичок в stackoverflow, но почему сообщение может быть приостановлено после того, как ответ уже принят? Переход к редактированию сообщения теперь, надеюсь, сделает его более понятным. – MikeD

+2

У вас было пять ответов, три из которых были удалены их авторами, потому что они поняли, что не были уверены, что вам нужно. Тот факт, что принятый ответ правильно угадал ваше намерение, не улучшает вопрос в этом отношении.Возможно, он заслуживает того, чтобы его снова открыли, когда вы добавили дополнительную стену текста, но я не вижу смысла. Я бы сказал, просто попробуйте быть более ясными в следующий раз, когда вы зададите вопрос. – Frank

ответ

1

Данное решение использует dplyr.

library(dplyr) 

Group данных по PID, подсчитать, сколько экземпляров есть этот PID, отфильтровывать те, которые достигают независимо от порога вы заинтересованы в, а затем выберите выбрать отчетливый PIDS

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

Использования что вновь созданный вектор подмножеству исходный dataframe и выберите уникальный location s

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

Для второй части они хотят только одно местоположение на pid, похоже. – Frank

+1

получил. добавлено 'filter (count == max (count))', я думаю, что он должен это делать – ano

+1

Нет необходимости в мутате, мы можем поместить фильтры вместе, последние 2 строки могут быть заменены на '. $ pid' ... – zx8754

0

Здесь есть возможность без использования 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) 
Смежные вопросы