代码之家  ›  专栏  ›  技术社区  ›  Brani

“apply”函数中的行/列计数器

  •  28
  • Brani  · 技术社区  · 16 年前

    如果有人想 apply 一个函数,即对一个矩阵的每一行的函数,但也要将该行的数目用作这个函数的参数。作为一个例子,假设您想要得到矩阵中每一行的数字的第n个根,其中n是行号。有别的方法吗(用 应用 仅限于)将行号绑定到初始矩阵的列,如下所示?

    test <- data.frame(x=c(26,21,20),y=c(34,29,28))
    
    t(apply(cbind(as.numeric(rownames(test)),test),1,function(x) x[2:3]^(1/x[1])))
    

    P.S.实际上如果 测试 真的是一个矩阵: test <- matrix(c(26,21,20,34,29,28),nrow=3) ,行名称(测试)没有帮助:( 谢谢您。

    5 回复  |  直到 9 年前
        1
  •  31
  •   Aniko    16 年前

    我通常做的是跑步 sapply 关于行号 1:nrow(test) 而不是 test 及使用 test[i,] 函数内部:

    t(sapply(1:nrow(test), function(i) test[i,]^(1/i)))
    

    不过,我不确定这是否真的有效。

        2
  •  3
  •   Scott C Wilson Joachim Kiørbye Bertelsen    11 年前

    如果给函数命名而不是使其匿名,则可以更轻松地传递参数。我们可以使用 nrow 以获取行数并将行数向量作为参数传入,以及要以这种方式索引的帧。

    为了清楚起见,我使用了一个不同的示例函数;对于2列矩阵,此示例将x列乘以y列:

    test <- data.frame(x=c(26,21,20),y=c(34,29,28))
    myfun <- function(position, df) {
        print(df[position,1] * df[position,2])
    }
    
    positions <- 1:nrow(test)
    lapply(positions, myfun, test)
    
        3
  •  2
  •   joran    14 年前

    cbind() 行编号似乎是一种非常简单的方法。对于矩阵(或数据帧),应执行以下操作:

    apply( cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1]) )
    

    或者你想策划什么。

        4
  •  2
  •   tuomastik zoubir REMILA    9 年前

    实际上,在矩阵的情况下,你甚至不需要 apply . 公正:

    test^(1/row(test))
    

    做你想做的,我想。我认为 row() 功能是你要找的东西。

        5
  •  0
  •   Green.River    11 年前

    我有点困惑,所以请原谅,如果我弄错了,但你想算出矩阵中每一行数字的第n根,其中n=行号。如果是这种情况,那么很简单的做法是创建一个与原始数组具有相同维度的新数组,每个列的值与对应的行号相同:

    test_row_order = array(seq(1:length(test[,1]), dim = dim(test))
    

    然后简单地应用一个函数(在本例中是第n个根):

    n_root = test^(1/test_row_order)