2017-05-07 36 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

相關問題