2013-12-08 106 views
0

我有兩個數據幀。其中一個包含165列(物種名稱)和近193.000行,每個單元格中的數目是從0到1的數字,這是物種在該單元格中存在的百分比可能性。將小於閾值的值設置爲零,並使用列特定的閾值

POINTID Abie_Xbor Acer_Camp Acer_Hyrc Acer_Obtu Acer_Pseu Achi_Gran 
    2  0.0279037 0.604687 0.0388309 0.0161980 0.0143966 0.240152 
    3  0.0294101 0.674846 0.0673055 0.0481405 0.0397423 0.231308 
    4  0.0292839 0.603869 0.0597947 0.0526606 0.0463431 0.188875 
    6  0.0331264 0.541165 0.0470451 0.0270871 0.0373348 0.256662 
    8  0.0393825 0.672371 0.0715808 0.0559353 0.0565391 0.230833 
    9  0.0376557 0.663732 0.0747417 0.0445794 0.0602539 0.229265 

第二數據幀包含164列(物種名稱,作爲第一數據幀)和一排,其是所述閾值以上這一點,我們假設物種是此物種的存在,並在不存在

Abie_Xbor Acer_Camp Acer_Hyrc Acer_Obtu Acer_Pseu Achi_Gran Acta_Spic 
0.3155 0.2816 0.2579 0.2074 0.3007 0.3513 0.3514 

我想要做的是使將包含在存在可能性(my.data)的可能性的數量每一個物種如果高於閾值的新的數據幀(THRES),如果它是在零數字的門檻下。

我知道這將是一個循環,如果聲明,但我是新的R,我不知道要做到這一點。 請幫幫我。

+0

請注意,這個問題是[交叉發表於CV](http://stats.stackexchange.com/questions/78988/how-to-do -a-for-loop-and-if-statement-between-data-frames) – gung

+1

請發佈[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great例如,一個簡化的數據集,裏面有一個你希望輸出看起來像什麼的例子,請閱讀[幫助頁](h ttp://stackoverflow.com/help/asking)提供有關如何針對SO提出問題的指導。您也可以閱讀[旅遊網頁](http://stackoverflow.com/tour),其中包含有關新用戶的SO的信息。 – gung

回答

1

我想你想是這樣的:

(化妝小型可重複的例子)

set.seed(101) 
speciesdat <- data.frame(pointID=1:10,matrix(runif(100),ncol=10, 
         dimnames=list(NULL,LETTERS[1:10]))) 
threshdat <- rbind(seq(0.1,1,by=0.1)) 

現在過程:

thresh <- unlist(threshdat) ## make data frame into a vector 
## 'sweep' runs the function column-by-column if MARGIN=2 
ss2 <- sweep(as.matrix(speciesdat[,-1]),MARGIN=2,STATS=thresh, 
      FUN=function(x,y) ifelse(x<y,0,x)) 
## recombine results with the first column 
speciesdat2 <- data.frame(pointID=speciesdat$pointID,ss2) 
+0

是的,這正是我想要的。非常感謝你 –

+0

如果這解決了你的問題,我們鼓勵你點擊複選標記接受答案... –

1

所以,很簡單有相同的列數(當然有相同的含義)。

frame2 = data.frame(POINTID=0, frame2) 

[R可與載體所以幀1的行可以直接與幀2

frame1[,1] < frame2 

可以使用一個顯式循環的幀1的每一行,但它通常使用的隱式循環「申請「

answer = apply(frame1, 1, function(x) x < frame2) 

這一切都相當草率的解決方案(特別是在更改幀2),但它希望證明一些基本R.此外,我一般寧願陣列和矩陣可能的時候(他們可以發直到使用標籤但通常更快)。

0

這產生了一個邏輯矩陣,可用於生成賦值爲「[< - 」; (假設多行數據幀的名稱是「的cols」而得名載體是「VEC」:

sweep(cols[-1], 2, vec, ">") # identifies the items to keep 

cols[-1][ sweep(cols[-1], 2, vec, "<") ] <- 0 

你的榜樣產生了關於與向量的長度列數不匹配警告,但想必你可以將矢量的長度調整爲正確的條目數