2017-02-07 22 views
0

У меня есть огромный фрейм данных с совпадающими объектами управления тегами. Соответствующий регистр: управление - 1: 3. Я пытаюсь выполнить повторную выборку идентификаторов case, а затем извлеките соответствующие элементы управления.Как подмножать одни и те же строки/идентификаторы повторно в r

Итак, у меня есть вектор идентификаторов, где идентификаторы можно повторить. Я хочу извлечь данные для случаев и элементов управления для каждого идентификатора вектора. Корпус и соответствующие элементы управления имеют одинаковый case_num. % In% всегда принимает уникальные идентификаторы из данных. Я использовал llply, чтобы сделать это. Это занимает около 2,5 секунд. Есть ли другой эффективный способ?

Я включаю простой пример и мое решение вопроса.

В моем случае длина вектора id в 1921 году функция должна извлекать элементы управления 1921 раз. Поэтому, если время можно уменьшить даже на секунду, это будет на самом деле много, в то время как я буду повторять весь процесс 1000 раз. Спасибо!

test_data=  

data.frame(id=c(1,1,2,4,4,5,6),value=c('g','e','r','j','a','b','c')) 

test_data 
id value 
1 1  g 
2 1  e 
3 2  r 
4 4  j 
5 4  a 
6 5  b 
7 6  c 



id_vec= c(1,4,1,5) 

library(plyr) 
newdata.list=llply(id_vec, function(x) test_data[test_data$id==x,]) 

## or if we make our data a data.table then 
library(data.table) 
test_data= data.table(test_data) 

newdata.list=llply(id_vec, function(x) test_data[id==x]) 

library(dplyr) 
newdata.frame= bind_rows(newdata.list) ### making it a dataframe 
newdata.frame 
    id value 
1: 1  g 
2: 1  e 
3: 4  j 
4: 4  a 
5: 1  g 
6: 1  e 
7: 5  b 
+0

Pls размещать данные как текст, а не в виде изображения. Используйте 'dput (your_data)' и скопируйте-вставьте результат. – GGamba

+0

сделал изменения, также добавил коды после получения комментариев. –

+0

Наверное, безопасно не смешивать plyr + dplyr + data.table; лучше просто выбрать 1. Plyr существенно заменил dplyr, поэтому, вероятно, не тот. – Frank

ответ

0

Первый разделить ваш кадр данных в список dataframes для каждого идентификатора:

split_data = split(test_data, test_data$id) 

Я думаю, вы могли бы остановиться здесь и работать с этим списком, который имеет каждый id отдельно, но только один раз. Однако, если вам действительно нужны копии данных для каждого повторения в id_vec, просто использовать список индексирование:

result = split_data[id_vec] 

Это очень расточительно, если в конце концов вы рекомбинируете в один кадр данных. Он включает в себя копирование всех данных, когда все действительно необходимо - это номера строк. Если я правильно понимаю, ваш пример плох, потому что числа дел повторяются в данных, тогда как ваши данные примера имеют уникальный id s. Вот способ, при повторных id с в обоих данных и id_vec в ресэмплировать данных без кадров данных копий:

## new example data 
test_data2 = data.frame(id=c(1, 1, 2, 3, 3, 4), value=c('g','e','r','j','a','b')) 
id_vec2 = c(3, 1, 2, 3, 4, 1) 

rows = lapply(id_vec2, FUN = function(x) which(test_data2$id == x))  
result = test_data2[unlist(rows), ] 
result 
#  id value 
# 4 3  j 
# 5 3  a 
# 1 1  g 
# 2 1  e 
# 3 2  r 
# 4.1 3  j 
# 5.1 3  a 
# 6 4  b 
# 1.1 1  g 
# 2.1 1  e 
+0

Это прекрасно работает. Вы правы, мой пример не идеален. Я отредактирую его. Большое спасибо. –