R 使用特定于列的阈值将小于阈值的值设置为零
我有两个数据帧。其中一个包含165列(物种名称)和近193000行,每个单元格中的数字为0到1,即该单元格中存在物种的可能性百分比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
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