2016-05-04 2 views
0

Я пытаюсь преобразовать dataframe состоящий из двух столбцов в именованный вектор (вложенный список). Информация в каждой строке по существу является ключом: пары значений, поэтому списки в конечном векторе должны быть названы ключами и содержать их соответствующие значения.Как преобразовать два столбца dataframe в именованный вектор?

Example input: 

Var1 Var2 
A  1 
A  2 
B  1 
B  3 
C  3 
C  4 
C  5 

Example Output: 
namedArray = list(A = c(1,2), B = c(1,3), C = c(3,4,5)) 

мне удалось сделать в пакете reshape2 это с помощью dcast(), однако это требует дополнительного пост-обработки, чтобы удалить имена строк и числовые апертуры, введенные посредством литья кадра данных.

Есть ли более эффективный способ достичь этого?

+2

Просьба показать небольшой воспроизводимый пример и ожидаемый результат на основе этого. – akrun

ответ

2

Если у вас есть 2 колонки: X и Y в dataframe df1, и вы хотите, значения Y, чтобы быть имена элементов со значениями из X:

myList <- as.list(df1$X) 
names(myList) <- df1$Y 

Для модифицированного вопроса, ответ на то, что есть это уже функции, делает именно это (и, возможно, был лучшим ответом, что я дал:

> split(dat$Var2, dat$Var1) 
$A 
[1] 1 2 

$B 
[1] 1 3 

$C 
[1] 3 4 5 
+0

Неясно, опуская пример в моем исходном вопросе. Мне нужно решение, которое обрабатывает отношения «один-много» между двумя переменными. – ejspina

+0

Это еще более ясно, что 'split' является полностью удовлетворительным ответом. –

+0

Спасибо, измененный ответ работает отлично. – ejspina

0

Если вы хотите пары ключ-значение в списке из кадра данных метод может выглядеть следующим образом:

x = data.frame(x=letters[1:5],y=1:5) 
y = split(x,seq(1:nrow(x))) 
names(y) = x$x 
y$a 
+0

Это дает тот же результат, что и ответ, приведенный выше, с помощью @ 42- – ejspina

0

Спасибо @ 42- и @MMerry за то, что заставили меня думать о split(). Я нашел хорошее решение, разделяющее одну переменную на другую и завершая вывод в список.

y <- as.list(split(df$Var2, df$Var1)) 
+1

Привет @flowscience, 'split()' должен выводить список, чтобы вы могли пропустить его в вызове 'as.list()'. Вы также можете отметить это как ответ, так как он помогает другим пользователям. – MMerry

+0

Еще лучше! Еще раз спасибо. – ejspina

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