这是一个有趣的问题,我似乎找不到答案。让我直接跳进去。我需要从下面创建一个数据框:
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对应于列表中的“one”。我知道如何从列表到数据框的另一种方式,但我无法弄清楚如何从数据框到列表。我有一个函数需要一个列表来输入函数。为了完整起见,这是使用列表的部分:
yi.bar <- unlist(lapply(y,mean))
s2i <- unlist(lapply(y,var))
有什么建议吗?
谢谢!
答案 0 :(得分:3)
这是一个非常简单的split
操作 - 不需要附加软件包:
split(dat$TPA,as.numeric(gsub("[^0-9]","",dat$plot)))
#$`1`
#[1] 900 950
#
#$`2`
#[1] 950 650
#
#$`3`
#[1] 650 1350
#...
如果有人正在考虑处理将数字转换为文本表示的任务,那么你就被打败了:
答案 1 :(得分: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