我正在使用R版本i386 3.1.1和RStudio 0.99.442。
我有大量的树种数据集,我从7个地块中收集了这些数据集,每个地块被分成5个子图(即35个不同的子图)。我试图让R运行我的数据集并打印每个图中存在的物种。
我认为我可以使用“aggregate”将“levels”函数应用于Species数据列并让它返回每个Plot和Subplot存在的Species,但它返回整个数据框的级别(12种,总计),而不是Subplot中实际存在的3或4种。
为了提供我正在尝试做的可重复的示例,我们可以使用R附带的“warpbreaks”数据集。
我将warpbreak中的'breaks'变量转换为factor变量来重新创建问题;因此它举例说明了我的“物种”变量,而“warpbreaks $ wool”代表“情节”,“warpbreaks $ tension”代表“subplot”。
require(stats)
warpbreaks$breaks = as.factor(warpbreaks$breaks)
aggregate(breaks ~ wool + tension, data = warpbreaks, FUN="levels")
如果我们看一下warpbreaks数据,那么对于“Plot”A(羊毛)和“Subplot”L(张力) - 所需的脚本将打印物种“26,30,54,25等”/ p>
breaks wool tension
1 26 A L
2 30 A L
3 54 A L
4 25 A L
5 70 A L
6 52 A L
7 51 A L
8 26 A L
9 67 A L
10 18 A M
11 21 A M
12 29 A M
...
相反,R返回这种类型的东西,它会打印所有图形的因子变量的所有级别:
wool tension breaks.1 breaks.2 breaks.3 breaks.4 breaks.5 breaks...
1 A L 10 12 13 14 15 ...
2 B L 10 12 13 14 15 ...
3 A M 10 12 13 14 15 ...
4 B M 10 12 13 14 15 ...
5 A H 10 12 13 14 15 ...
6 B H 10 12 13 14 15 ...
如何让它仅打印该绘图/子图组合中存在的因子?我完全不使用“聚合”吗?我认为对于体验R用户来说这是一个相对容易的任务......
首次发布stackoverflow帖子 - 非常感谢您对正确代码的任何帮助或推动!
非常感谢。
答案 0 :(得分:1)
尝试FUN=unique
而不是FUN=levels
。 levels
将返回因素的每个级别,正如您已经猜测的那样。 unique(...)
只会返回唯一级别。
y <- aggregate(breaks ~ wool + tension, data = warpbreaks, FUN=unique)
wool tension breaks
1 A L 14, 18, 29, 13, 31, 28, 27, 30
2 B L 15, 4, 17, 9, 19, 23, 10, 26
3 A M 8, 11, 17, 7, 2, 20, 18, 21
4 B M 24, 14, 9, 6, 22, 16, 11, 17
5 A H 21, 11, 12, 8, 1, 25, 16, 5, 14
6 B H 10, 11, 12, 7, 3, 5, 6, 16
注意 breaks
列有点奇怪,因为在该列的每一行而不是一个值(对数据帧有意义),你有一个值向量。即breaks
列的每个单元格都不是字符串;这是一个载体!
> class(y$wool)
[1] "factor"
> class(y$breaks) # list !!
[1] "list"
> y$breaks[[1]] # first row in breaks
[1] 26 30 54 25 70 52 51 67
Levels: 10 12 13 14 15 16 17 18 19 20 21 24 25 26 27 28 29 30 31 35 36 39 41 42 43 44 51 52 54 67 70
请注意,要访问breaks
列的第一个元素,而不是y$breaks[1]
(就像使用wool
或tension
列一样),您需要执行此操作因此而y$breaks[[1]]
。
数据框并不真正意味着像这样工作;数据帧中的单个单元应该具有单个值,并且大多数函数都希望数据帧符合这一点,因此在进行将来的处理时请记住这一点。
如果您想转换为字符串,请使用(例如)FUN=function (x) paste(unique(x), collapse=', ')
;然后y$breaks
将是一列字符串并且表现正常。