2016-04-26 61 views
0

我是R的这个世界的新手。从我读过的任何东西,我知道apply()用于遍历矩阵/矢量/数据框中的每一行/列。在R中的数据框的子集中使用apply()

我必须声明,我的代码:

a$count <- apply(a[1:9,],1,countRows,species="setosa") 

coutRows功能如下:

countRows <- function(x,species){ 
    count <- sum(iris$sl == x['sl'] & iris$sw == x['sw'] & iris$Species == species) 
} 

我的本意是仅在第9行中a工作在有的值添加到count列使用任何在countRows()中完成的计算。这就是为什么我使用a[1:9,]作为apply()的第一个参数。

出于某种原因,apply()在完整的数据帧上运行。的a在上面的语句的执行结束时的内容如下所示:

 sl sw count species 
1 low low  1  setosa 
2 mid low  0  setosa 
3 high low  0  setosa 
4 low mid 32  setosa 
5 mid mid  1  setosa 
6 high mid  0  setosa 
7 low high 12  setosa 
8 mid high  4  setosa 
9 high high  0  setosa 
10 low low  1 versicolor 
11 mid low  0 versicolor 
12 high low  0 versicolor 
13 low mid 32 versicolor 
14 mid mid  1 versicolor 
15 high mid  0 versicolor 
16 low high 12 versicolor 
17 mid high  4 versicolor 
18 high high  0 versicolor 
19 low low  1 virginica 
20 mid low  0 virginica 
21 high low  0 virginica 
22 low mid 32 virginica 
23 mid mid  1 virginica 
24 high mid  0 virginica 
25 low high 12 virginica 
26 mid high  4 virginica 
27 high high  0 virginica 

我期望剩余18行到含有0下count列,因为我已经一切设置为0最初。

我在apply()声明中做了什么错误?

+0

有两个问题,1)您将输出分配给整个“a”,即“$ count”2)您可能需要转置 – akrun

+0

问题1是主要问题。我以这种方式解决了'a [1:9,'count'] < - apply(a [1:9,],1,countRows,species =“setosa”)''。有没有更好的方法来做到这一点? –

+0

'countRows'函数在做什么? – akrun

回答

1

正如你在评论中提到的,狭窄的问题的解决方案是指定只是要改变的count位:

a[1:9,'count'] <- apply(a[1:9,],1,countRows,species="setosa") 

然而,在看着你似乎是试图在这里做,我有一个备选的建议。

这正好弥补了一些数据看起来像你的:

cutnum <- ggplot2::cut_number 
my_iris <- with(iris, 
    data.frame(sw=cutnum(Sepal.Width,3,labels=c("low","mid","high")), 
       sl=cutnum(Sepal.Length,3,labels=c("low","mid","high")), 
       species=Species)) 

现在table将获得每行类型的数量,与结果(在这种情况下)一个3x3x3的数组,as.data.frame会表转换为长格式...

as.data.frame(table(my_iris)) 

结果是这样的:

 sw sl species Freq 
1 low low  setosa 2 
2 mid low  setosa 15 
3 high low  setosa 28 
4 low mid  setosa 0 
5 mid mid  setosa 0 
...