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