2017-05-07 26 views
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的所有信息。为什么所有的零都有这样的区别?

回答

1

为什么不直接创建一个函数,将数据框除以最后一列,然后用零代替NAs?

prop_last_col <- function(df) { 
     prop <- df/df[, ncol(df)] 
     prop[is.na(prop)] <- 0 
     return(prop) 
    } 

prop_last(b) 
     v1  v2 v3 
1 0.2000000 0.6000000 1 
2 0.3333333 0.6666667 1 


prop_last(b1) 
    v1 v2 v3 
1 0 0 0 
2 0 0 0 

如果您希望它与您的示例具有相同的格式,您可以转置结果。

+0

感谢您的回复。这肯定会起作用。我只是想知道为什么R对待不同时,最后一列都是零,至少有一个不是零。我希望有人能告诉我解决这个问题的根本原因和直接方法,所以我不必采取额外的步骤将NA转换为零。顺便说一下,如果可以,我可以接受多个解决方案。 – Rocky

+2

这是因为每当行的最后一个元素为零时,您都返回长度为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

+0

哦,你只能接受[一个答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Sraffa