2013-09-13 3 views
2

Это интересный вопрос, на который я не могу найти ответ. Позвольте мне просто прыгнуть прямо в мне нужно принять кадр данных, созданный из:.Кадр данных в структурированный список

TPA <- ddply(MT,~plot,summarise,TPA=length(unique(tree.number))*50) 
> TPA 

plot TPA 
1 10A 700 
2 10B 1000 
3 1A 900 
4 1B 950 
5 2A 950 
6 2B 650 
7 3A 650 
8 3B 1350 
9 4A 1450 
10 4B 1350 
11 5A 850 
12 5B 1100 
13 6A 1050 
14 6B 550 
15 7A 850 
16 7B 800 
17 8A 2450 
18 8B 950 
19 9A 1150 
20 9B 1000 

и преобразовать это:

y <- list(one=c(900,950), two=c(950,650), three=c(650,1350), four=c(1450,1350),  five=c(850,1100), six=c(1050,550), seven=c(850,800), eight=c(2450,950), nine=c(1150,1000), ten=c(700,1000)) 
> y 
$one 
[1] 900 950 

$two 
[1] 950 650 

$three 
[1] 650 1350 

$four 
[1] 1450 1350 

$five 
[1] 850 1100 

$six 
[1] 1050 550 

$seven 
[1] 850 800 

$eight 
[1] 2450 950 

$nine 
[1] 1150 1000 

$ten 
[1] 700 1000 

Обратите внимание, что 1A в кадре данных соответствует «один» в список. Я знаю, как перейти от списка к кадру данных, но я не могу понять, как перейти от фрейма данных к списку. У меня есть функция, которая требует, чтобы список передавался в функцию. Для полноты, вот часть, которая использует список:

yi.bar <- unlist(lapply(y,mean)) 
s2i <- unlist(lapply(y,var)) 

Любые предложения?

Спасибо!

ответ

1

Извлечение номера из plot:

TPA$plot_num = as.numeric(regmatches(TPA$plot, regexpr("\\d+", TPA$plot, perl=TRUE))) 

Тогда это действительно просто dlply вызов:

TPA_split = dlply(TPA, .(plot_num), function(df) df$TPA) 

Выход:

> TPA_split 
$`1` 
[1] 900 950 

$`2` 
[1] 950 650 

$`3` 
[1] 650 1350 

$`4` 
[1] 1450 1350 

$`5` 
[1] 850 1100 

$`6` 
[1] 1050 550 

$`7` 
[1] 850 800 

$`8` 
[1] 2450 950 

$`9` 
[1] 1150 1000 

$`10` 
[1] 700 1000 
+1

Вы могли бы хотеть, чтобы обернуть 'as.numeric' где-то там, чтобы автозаказ не помещал 10 впереди 2. – thelatemail

+0

@thelatemail: Привет, исправлено. – Marius

+0

Я закончил тем, что использовал этот метод, так как он вписывался в мой рабочий процесс немного лучше. Спасибо за помощь! – user2325155

3

Это довольно простой split операция - нет потребность в дополнительных пакетах:

split(dat$TPA,as.numeric(gsub("[^0-9]","",dat$plot))) 

#$`1` 
#[1] 900 950 
# 
#$`2` 
#[1] 950 650 
# 
#$`3` 
#[1] 650 1350 
#... 

И если кто-то рассматривает решения задачи преобразования чисел в текст представления, вы избили на удар:

http://socserv.mcmaster.ca/jfox/Papers/numbers2words.pdf

+0

Спасибо вам обоим! Они отлично работали! Теперь ... если только R может заказать пиццу. – user2325155

+0

@ user2325155 Вы опоздали на 9 лет: 'fortune (66)' (из пакета 'fortunes'). –

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