例如,我有一个矩阵 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)