打印选择标准中存在的因子的水平而不是R中因子的所有水平?

时间:2015-07-23 11:41:58

标签: r

我正在使用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等”

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帖子 - 非常感谢您对正确代码的任何帮助或推动!

非常感谢。

1 个答案:

答案 0 :(得分:1)

尝试FUN=unique而不是FUN=levelslevels将返回因素的每个级别,正如您已经猜测的那样。 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](就像使用wooltension列一样),您需要执行此操作因此而y$breaks[[1]]

数据框并不真正意味着像这样工作;数据帧中的单个单元应该具有单个值,并且大多数函数都希望数据帧符合这一点,因此在进行将来的处理时请记住这一点。

如果您想转换为字符串,请使用(例如)FUN=function (x) paste(unique(x), collapse=', ');然后y$breaks将是一列字符串并且表现正常。