2014-02-20 9 views
0

в РИ подготовил следующий список L:R: есть ли встроенные функции для сортировки списков?

>L 
[[1]] 
[1] "A" "B" "C" 

[[2]] 
[1] "D" 

[[3]] 
[1] NULL 

Я хотел бы управлять списком L поступающего в базе данных df как

>df 
    df[,1] df[,2] 
     "A"  1 
     "B"  1 
     "C"  1 
     "D"  2 

где второй столбец дает позицию в списке L соответствующего элемента в столбце 1. Мой вопрос: есть (есть) встроенная функция (-ы), которая может быстро выполнить эту манипуляцию? Я могу сделать это, используя «грубую силу», но мое решение не очень хорошо масштабируется, когда я рассматриваю гораздо большие списки.

Благодарю вас всех!

ответ

3

Вы получите warning из-за вашего NULL значения, но вы можете использовать stack если вы даете элементов списка names:

L <- list(c("A", "B", "C"), "D", NULL) 
stack(setNames(L, seq_along(L))) 
# values ind 
# 1  A 1 
# 2  B 1 
# 3  C 1 
# 4  D 2 
# Warning message: 
# In stack.default(setNames(L, seq_along(L))) : 
# non-vector elements will be ignored 

Если warning неугодно, вы можете, конечно, запустить stack на элементах не NULL, но сделайте это после того, как вы назовете свои элементы списка, чтобы столбец «ind» отображал правильное значение.

я покажу в 2 этапа просто для ясности:

names(L) <- seq_along(L) 
stack(L[!sapply(L, is.null)]) 

Точно так же, если вы избавились от NULL элементов списка, вы можете использовать melt из «reshape2». Вы ничего не добиваетесь в краткости, и я не уверен, что вы получаете что-либо в эффективности, но я думал, что поделюсь им как вариант.

library(reshape2) 
names(L) <- seq_along(L) 
melt(L[!sapply(L, is.null)]) 
+0

'stack' делает работу; Большое спасибо! Я не знал этого :-) – Avitus

+1

@Avitus, 'stack', кажется, является одной из тех сильно недооцененных функций ... – A5C1D2H2I1M1N2O1R2T1

2

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

> cbind(unlist(L), rep(1:length(L), sapply(L, length))) 
    [,1] [,2] 
[1,] "A" "1" 
[2,] "B" "1" 
[3,] "C" "1" 
[4,] "D" "2" 
+0

Спасибо @Thomas за ваш ответ; оценили. – Avitus

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