我有两个数据框。其中一个包含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的新手,我不知道这样做。 请帮帮我。
答案 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
您的示例产生了一个关于列数与向量长度不匹配的警告,但可能您可以将向量的长度调整为正确的条目数。