1
我有一个数据帧(以下简化版本)应用功能,以行返回载体,而不是名单
b<-data.frame('v1'=1:2,'v2'=3:4,'v3'=5:6)
如果我使用适用于行:
test<-apply(b,1,function(x) {if (x[length(x)]>0) return (x/x[length(x)]) else return (0)})
我:
[,1] [,2]
v1 0.2 0.3333333
v2 0.6 0.6666667
v3 1.0 1.0000000
到目前为止这么好,因为我确实需要列名v1,v2,v3成为测试中的行名。 但是,如果数据帧是全零,
b1<-data.frame('v1'=c(0,0),'v2'=c(0,0),'v3'=c(0,0))
test<-apply(b1,1,function(x) {if (x[length(x)]>0) return (x/x[length(x)]) else return (0)})
测试将返回一个向量为0 0 我的问题是如何让测试返回类似
[,1] [,2]
v1 0 0
v2 0 0
v3 0 0
基本上,如果最后一个在行是零我想将行中的所有内容都设为0,更重要的是我希望返回是一个列表,以便获得v1,v2,v3行名(如果返回列表,我可以更改为数据框),现在返回是矢量0,0我丢失了v1,v2,v3的所有信息。为什么所有的零都有这样的区别?
感谢您的回复。这肯定会起作用。我只是想知道为什么R对待不同时,最后一列都是零,至少有一个不是零。我希望有人能告诉我解决这个问题的根本原因和直接方法,所以我不必采取额外的步骤将NA转换为零。顺便说一下,如果可以,我可以接受多个解决方案。 – Rocky
这是因为每当行的最后一个元素为零时,您都返回长度为1的数字向量。如果该值大于0,则返回行上的操作(保留名称)。如果将最后一个返回值更改为'x * 0',就像'test <-apply(b1,1,function(x){if(x [length(x)]> 0)return(x/x [length x)])else return(x * 0)})'你会得到你想要的结果。不过,我认为代码有点难以阅读。 – Sraffa
哦,你只能接受[一个答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Sraffa