【问题标题】:Set values less than threshold to zero, with column-specific thresholds使用特定于列的阈值将小于阈值的值设置为零
【发布时间】:2013-12-08 20:43:51
【问题描述】:

我有两个数据框。其中之一包含 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 的新手,我不知道 for 这样做。 请帮帮我。

【问题讨论】:

  • 注意这个问题是cross-posted on CV
  • 请发布reproducible example,即一个简化的数据集,其中包含您希望输出的样子的示例。另请阅读help pages,它提供了有关如何就 SO 提出问题的指导。您可能还想阅读tour page,其中包含针对新用户的 SO 信息。

标签: r


【解决方案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)

【讨论】:

  • 是的,这正是我想要的。非常感谢
  • 如果这解决了您的问题,我们鼓励您单击复选标记以接受答案...
【解决方案2】:

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

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

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

frame1[,1] < frame2

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

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

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

【讨论】:

    【解决方案3】:

    这会产生一个逻辑矩阵,可用于生成带有“[

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-06
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2020-12-24
      • 2015-04-10
      • 2018-08-09
      相关资源
      最近更新 更多