在矢量中保存for循环的结果

时间:2012-12-02 17:01:41

标签: r

我觉得我太累了,看不出错误。我编写了一个函数来从'for'循环中获取两个数据集的最大值:

plot_zu <- function(x) {for (i in 1:x){
    z=data_raw[grep(a[i], data_raw$Gene.names),]
    b=data_raw_ace[grep(a[i], data_raw_ace$Gene.names),]
    p<-vector("numeric", length(1:length(a)))
    p[i]<-max(z$t_test_diff)
    return(p)} 
}

想象一下:a是名称向量,数据集(data_raw(_ace))由它过滤。最后,我希望在向量中包含列t_test_diff的所有最大值。之后,我还想从data_raw_ace添加t_test_diff列值。

问题是,我得到了这个:

[1] 1.210213 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
[8] 0.000000 0.000000

所以括号或其他东西有问题,但我看不到它(第一个值适合)。对不起,没有好的例子,但我认为这是可以理解的,也是一个容易解决的问题。

如果需要,我可以添加另一个例子。

非常感谢!!

感激不尽,

亨德里克

3 个答案:

答案 0 :(得分:1)

看起来你通过在循环中定义它来覆盖每个新迭代中的p。

答案 1 :(得分:1)

在没有数据甚至是你对这个功能的调用的情况下,我将根据我的想法提供替代方案。您似乎只想选择那些“data_raw”行,其“Gene.names”列值在“a”定义的集合中。如果是这样,那就是:

 z <- data_raw[ data_raw$Gene.names %in% a , ]  # no loop needed

 b <- data_raw_ace[ data_raw_ace$Gene.names %in% a , ] # again no loop needed
 # Next step is unclear

如果你想在“[”里面使用grep或grepl,那么请使用sapply:

 z <- data_raw[ sapply(a, grep, x= data_raw$Gene.names), ]  # (still) no loop needed
 b <- data_raw_ace[ sapply(a, grep, x= data_raw_ace$Gene.names),  ]

当你这样做时,它需要什么?

p<-vector("numeric", length(1:length(a)))
p[i]<-max(z$t_test_diff)

如果您想要两个数据子集中具有相同名称的列的最大值,请执行以下操作:

p <- pmax( z$t_test_diff, b$t_test_diff )

基于你上面的进一步评论,我(现在)想想:

p <- apply( cbind(z$t_test_diff), abs(b$t_test_diff), 1, function(x) x[which.max(abs(x))])

答案 2 :(得分:0)

vapply这样做,消除了for循环。未经测试。

vapply(1:x, FUN.VALUE=numeric(1), FUN=function(x) {
    z=data_raw[grep(a[i], data_raw$Gene.names),]
    b=data_raw_ace[grep(a[i], data_raw_ace$Gene.names),]  # Is this needed?

    return(max(z$t_test_diff))
})