在R中使用apply时如何打印当前行的名称?

Han*_*Sun 4 statistics r

例如,我有一个矩阵 k

> k
  d e
a 1 3
b 2 4
Run Code Online (Sandbox Code Playgroud)

我想在k上应用一个函数

> apply(k,MARGIN=1,function(p) {p+1})
a b
d 2 3
e 4 5
Run Code Online (Sandbox Code Playgroud)

但是,我还想打印rowname行,apply以便我可以知道当时应用了哪一行功能.

它可能看起来像这样:

apply(k,MARGIN=1,function(p) {print(rowname(p)); p+1})
Run Code Online (Sandbox Code Playgroud)

但我真的不知道如何在R中做到这一点.有没有人有任何想法?

Tim*_*m P 12

这是我认为你问的一个简洁的解决方案.(我称之为输入矩阵mat而不是k为了清晰 - 在这个例子中,mat有2列10行,行名为abc1到abc10.)

在下面的代码中,结果out1是您想要计算的内容(apply命令的结果).结果out2是相同的,out1除了它打印出它正在处理的rownames(我每行延迟0.3秒,所以你可以看到它真的这样做 - 当你希望代码运行完全时把它拿出来显然速度!)

我提出的技巧是将行号(1到n)绑定到左侧mat(创建一个带有一个附加列的矩阵),然后使用它来引用返回的rownames mat.注意这一行x = y[-1]意味着函数内的实际计算(这里,加1)忽略第一列行号,这意味着它与完成的计算相同out1.无论你想对行执行什么样的计算都可以这样做 - 只是假装y从不存在,并使用表达你想要的计算x.希望这可以帮助.

set.seed(1234)
mat = as.matrix(data.frame(x = rpois(10,4), y = rpois(10,4)))
rownames(mat) = paste("abc", 1:nrow(mat), sep="")
out1 = apply(mat,1,function(x) {x+1})
out2 = apply(cbind(seq_len(nrow(mat)),mat),1,
             function(y) {
                           x = y[-1]
                           cat("Doing row:",rownames(mat)[y[1]],"\n")
                           Sys.sleep(0.3)
                           x+1
                          }
            )

identical(out1,out2)
Run Code Online (Sandbox Code Playgroud)


dar*_*zig -2

据我所知,您不能使用 来做到这一点apply,但您可以循环遍历rownames数据框的 。蹩脚的例子:

lapply(rownames(mtcars), function(x) sprintf('The mpg of %s is %s.', x, mtcars[x, 1]))
Run Code Online (Sandbox Code Playgroud)