2013-12-08 107 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 

你的榜样产生了关于与向量的长度列数不匹配警告,但想必你可以将矢量的长度调整为正确的条目数