2016-09-23 81 views
-2

我有一個複雜的矩陣,每個人有多行。我創建了一個腳本,用於總結每個人的不同變量。爲了做到這一點,我首先創建一個列表,其中包含新的彙總變量。爲了得到一些變量,我需要介紹的,如果clases類似如下:if語句的問題

this_iids_roh <- dat[class,] 
my_list<-c("Froh"=(sum(this_iids_roh$KB)/2881033), 
     "chr1"= if (this_iids_roh$CHR==1) {(sum(this_iids_roh$KB)/247249.719)*100}, 
     "chr2"= if (this_iids_roh$CHR==2) {(sum(this_iids_roh$KB)/242193.529)*100}, 
     "chr3"= if (this_iids_roh$CHR==3) {(sum(this_iids_roh$KB)/198295.559)*100}) 
return(my_list) 

但是當我做運行此腳本(這只是一小部分),我只得到了「FROH」和「CHR1 「變量。我嘗試了幾件事情,但在「chr1」之後我無法獲得其他變量。 我希望你能幫助我!

+1

請仔細閱讀[MCVE]和編輯您的問題! – jogo

+0

有人可以向我解釋爲什麼這個問題值得反對票嗎? – Cebs

+0

第一:我**不是**的一個downvoters。在我看來,你的問題並不尊重[ask]和[mcve]中的條件。你沒有提供數據來玩。你沒有給出預期的結果。你的代碼不一致(從函數定義中有return(..)和孤獨的'}')。 – jogo

回答

1

而不是你以外的條件可以直接使用該條件來子集數據。

this_iids_roh <- NULL 
this_iids_roh$CHR = rep(c(1,2,3),10) 
this_iids_roh$KB = runif(30)*100000 
this_iids_roh = as.data.frame(this_iids_roh) 

做到這一點的方法是

my_list<-c("Froh"=(sum(this_iids_roh$KB)/2881033), 
     "chr1"= {(sum(this_iids_roh$KB[this_iids_roh$CHR==1])/247249.719)*100}, 
     "chr2"= {(sum(this_iids_roh$KB[this_iids_roh$CHR==2])/242193.529)*100}, 
     "chr3"= {(sum(this_iids_roh$KB[this_iids_roh$CHR==3])/198295.559)*100}) 
> my_list 
    Froh  chr1  chr2  chr3 
0.60958 203.99334 251.06703 324.65984 

希望這解決了這個問題。請注意,條件寫在上面的方括號內。


alternativly

my_list<-c(Froh= sum(this_iids_roh$KB)/2881033, 
      chr1= sum(this_iids_roh$KB[this_iids_roh$CHR==1])/2472.49719, 
      chr2= sum(this_iids_roh$KB[this_iids_roh$CHR==2])/2421.93529, 
      chr3= sum(this_iids_roh$KB[this_iids_roh$CHR==3])/1982.95559) 
my_list 

還細跟with()

my_list <- with(this_iids_roh, c(Froh= sum(KB)/2881033, 
      chr1= sum(KB[CHR==1])/2472.49719, 
      chr2= sum(KB[CHR==2])/2421.93529, 
      chr3= sum(KB[CHR==3])/1982.95559)) 
my_list 
+0

大括號是怎麼回事?至少可以說這是非常規的(R中的花括號用於分組*語句*,用分號或換行符分隔),並且代碼在沒有它們的情況下也可以正常工作。 –

+0

我只是想盡量少編輯他的代碼。花括號可以在不影響輸出的情況下移除。 – 9Heads

+0

非常感謝,它的工作原理,我嘗試沒有捲曲牙套,並沒有工作,所以我回到瞭如果。現在使用它們的大括號 – Cebs