使用列特定阈值将小于阈值的值设置为零

时间:2013-12-08 20:43:51

标签: r

我有两个数据框。其中一个包含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)并且是否低于阈值,则可能性的数量零号。

我知道这将是一个for循环和if语句,但我是R的新手,我不知道这样做。 请帮帮我。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

具有相同数量的列(当然具有相同的含义)更简单。

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

R与向量一起工作,因此可以将一行frame1直接与frame2进行比较

frame1[,1] < frame2

可以为frame1的每一行使用显式循环,但通常使用隐式循环“apply”

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

这是一个相当草率的解决方案(特别是改变frame2),但它有希望演示一些基本的R.此外,我通常更喜欢数组和矩阵(他们仍然可以使用标签,但通常更快)。

答案 2 :(得分:0)

这产生了一个逻辑矩阵,可用于生成带有“[&lt; - ”; (假设多行数据帧的名称是“cols”,命名向量是“vec”:

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

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

您的示例产生了一个关于列数与向量长度不匹配的警告,但可能您可以将向量的长度调整为正确的条目数。