2016-07-14 5 views
3

Я пытаюсь использовать команду dplyr 'mutate' для выполнения сопоставления по списку массивов, но я получаю сообщение об ошибке «Ошибка: рекурсивная индексация не удалась на уровне 2». вот пример:Доступ к элементам списка в мутате

templist=list();templist[["A"]]=c(6,9,8,1);templist[["B"]]=c(1,9,6,8);templist[["C"]]=c(8,1,9,6) 

tempdat=data.frame(SYSTEM=c("A","A","A","B","B","B","C","C","C"),nums=c(1,8,9,1,8,9,1,8,9)) 

который обеспечивает

templist 
$A 
[1] 6 9 8 1 

$B 
[1] 1 9 6 8 

$C 
[1] 8 1 9 6 

и

tempdat 
    SYSTEM idnum 
1  A  1 
2  A  8 
3  A  9 
4  B  1 
5  B  8 
6  B  9 
7  C  1 
8  C  8 
9  C  9 

я тогда хочу е в позиции совпадающих номеров списки, соответствующие соответствующим системам. Например.

tempdat %>% mutate(numids=match(nums,templist[[SYSTEM]])) 

должен давать

tempdat 
    SYSTEM nums numids 
1  A 1  1 
2  A 8  3 
3  A 9  2 
4  B 1  1 
5  B 8  4 
6  B 9  2 
7  C 1  2 
8  C 8  1 
9  C 9  3 

но я получаю упомянутые выше ошибки вместо

(Error: recursive indexing failed at level 2)

Может кто-нибудь объяснить, почему это не удается? Или еще лучше выяснить, как правильно это сделать? У меня есть догадка, что это можно сделать с помощью цикла for для создания отдельных кадров данных для каждого списка, а затем использовать left_join для добавления индексов соответствия из каждого системного фрейма в исходный фрейм, но это похоже на то, что это, вероятно, будет очень неэффективным , inelegant и clunky ...

ответ

2

Причина, по которой это не удается, заключается в том, что [[ для списка не принимает векторную индексацию, а переменная, переданная в mutate, является по существу вектором. Быстрое исправление будет группировать ваш кадр данных по SYSTEM и передать unique переменные к ней, таким образом, для каждой группы SYSTEM бы одно значение вместо вектора:

tempdat %>% group_by(SYSTEM) %>% mutate(numids=match(nums,templist[[unique(SYSTEM)]])) 

# Source: local data frame [9 x 3] 
# Groups: SYSTEM [3] 
# 
# SYSTEM nums numids 
# (fctr) (dbl) (int) 
# 1  A  1  4 
# 2  A  8  3 
# 3  A  9  2 
# 4  B  1  1 
# 5  B  8  4 
# 6  B  9  2 
# 7  C  1  2 
# 8  C  8  1 
# 9  C  9  3 

Если вы проверяете templist[[c("A", "B", "A")]], вы обнаружите, что это точно так же, как вы видели:

Error in templist[[c("A", "B", "A")]] : recursive indexing failed at level 2

+0

Отлично! Работает как шарм. – wmsmith

Смежные вопросы