2015-11-20 59 views
0

我在數據框上運行apply函數,以便提取值大於-1的所有單元格的位置。但是,在我的結果中,每列都有不同數量的單元格,因此R不允許我將結果轉換爲數據框。如何添加NA值以根據不同長度的矢量創建數據矩陣?

樣品我原來的數據幀(實際有超過500列):

Slopes<-data.frame(B1=5:495,B2=-100:390, B3=10:500,B4=-200:290) 
row.names(Slopes)<-seq(0.01, 4.91, 0.01) 

這是我跑過去的向量函數:

Z<-apply(Slopes, 2, function(x) which(x>-1)) 

我怎樣才能填補缺失的細胞與「NA」,以便我可以將這些結果轉換爲數據框?

另外我只需要添加這個編輯,因爲現在我已經成功地創建了數據框,我發現R返回了行號而不是行名。我可以對我的應用代碼進行任何更改,以返回行名稱嗎?

+0

您想提取值還是位置? – A5C1D2H2I1M1N2O1R2T1

+0

如果你想從'Z'到'data.frame',只需要'data.frame(lapply(Z,「length < - 」,max(lengths(Z))))''。 – A5C1D2H2I1M1N2O1R2T1

+0

爲什麼不使用'which(斜率> -1,arr.ind = TRUE)'這將告訴你究竟在哪裏價值在斜坡 –

回答

0

Z開始,您可以使用以下命令:

data.frame(lapply(Z, "length<-", max(lengths(Z)))) 

輸出會是這樣:

> head(data.frame(lapply(Z, "length<-", max(lengths(Z))))) 
    B1 B2 B3 B4 
0.01 1 101 1 201 
0.02 2 102 2 202 
0.03 3 103 3 203 
0.04 4 104 4 204 
0.05 5 105 5 205 
0.06 6 106 6 206 
> tail(data.frame(lapply(Z, "length<-", max(lengths(Z))))) 
     B1 B2 B3 B4 
4.86 486 NA 486 NA 
4.87 487 NA 487 NA 
4.88 488 NA 488 NA 
4.89 489 NA 489 NA 
4.9 490 NA 490 NA 
4.91 491 NA 491 NA 

要獲得rownames而不是,只需更改您的「Z」,如下所示:

Z <- apply(Slopes, 2, function(x) rownames(Slopes)[which(x>-1)]) 
+0

謝謝,此代碼工作。但是,現在我看到了輸出,它看起來像我的原始應用程序代碼可能會更好,因爲它返回行號。我真正需要的是行名。有關更改原始應用代碼以實現此目的的任何建議? – user507

+0

謝謝......這個伎倆。 – user507

0

試試這個:

Z <- apply(Slopes, 2, function(x) which(x>-1)) 

str(Z) 

# Length of longest sub-list 
max(rapply(Z, length)) 
## 491 

matrix_Z <- sapply(Z,'[',1:491) 

tail(matrix_Z) 
##  B1 B2 B3 B4 
##4.86 486 NA 486 NA 
##4.87 487 NA 487 NA 
##4.88 488 NA 488 NA 
##4.89 489 NA 489 NA 
##4.9 490 NA 490 NA 
##4.91 491 NA 491 NA 
+0

對不起,我忘了提及我的原始數據框有500多列(爲了發佈我的問題,我簡化了它)。有沒有一種很好的方法來確定列表的長度,而無需手動查看每個矢量的輸出? – user507