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

R 使用特定于列的阈值将小于阈值的值设置为零,r,R,我有两个数据帧。其中一个包含165列(物种名称)和近193000行,每个单元格中的数字为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.04814

我有两个数据帧。其中一个包含165列(物种名称)和近193000行,每个单元格中的数字为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方面是新手,我不知道for如何做。
请帮帮我。

我想你想要这样的东西:

(组成小型可复制示例)

set.seed(101)

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

R使用向量,因此帧1的一行可以直接与帧2进行比较

frame1[,1] < frame2
frame1[,1]
可以对frame1的每一行使用显式循环,但通常使用隐式循环“apply”

answer=apply(框架1,1,函数(x)x

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

这会生成一个逻辑矩阵,可用于生成带有“[””的赋值,标识要保留的项
cols[-1][sweep(cols[-1],2,vec,"请注意,这个问题是。请发布一个,即一个简化的数据集,并举例说明您希望输出是什么样子。还请阅读提供有关如何提问的指导的。您可能还想阅读,其中有关于SO的信息供新用户使用。是的,这正是我想要的。非常感谢这解决了您的问题问题:我们鼓励您单击复选标记以接受答案。。。
 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)
frame2 = data.frame(POINTID=0, frame2)
frame1[,1] < frame2
answer = apply(frame1, 1, function(x) x < frame2)
sweep(cols[-1], 2, vec, ">") # identifies the items to keep

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