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))

有什么建议么?

谢谢!

4

2 回答 2

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

于 2013-09-13T00:51:31.353 回答
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
于 2013-09-13T00:44:48.413 回答