【问题标题】:Nth smallest value for every column in data.frame in RR中data.frame中每一列的第N个最小值
【发布时间】:2017-01-17 02:23:26
【问题描述】:

我想为 data.frame 中的每一列找到第 n 个最小的数字。

在下面的示例中,我使用 dcast nth 函数指定了第二个最小值。有人可以帮忙编写函数代码吗?

library(vegclust)
library(dplyr)
data(wetland)
dfnorm = decostand(wetland,"normalize")
dfchord = dist(dfnorm, method = "euclidean")
dfchord = data.frame(as.matrix(dfchord)
number_function = function(x) nth(x,2) # can change 2 to any number..

answer_vector = apply(dfchord, 2, number) # here, 2 specifying apply on columns

实际的答案是这样的..

ans = c(0.5689322,0.579568297,0.315017693,0.315017693,0.632246369, 0.868563003, 0.704638684, 0.35827587, 0.725220337, 0.516397779) # length of 1:38

【问题讨论】:

  • 这听起来有点奇怪。为了让您和您的同事将来更容易阅读,您可能需要melt 然后split-apply-combine

标签: r dcast


【解决方案1】:

只是一个警告,如果你不指定 dplyr 的nth() 的顺序,它实际上不会进行排序:

例如,

> sapply(mtcars, dplyr::nth, 2)
    mpg     cyl    disp      hp    drat      wt    qsec      vs      am    gear    carb 
 21.000   6.000 160.000 110.000   3.900   2.875  17.020   0.000   1.000   4.000   4.000 

其实就是第二行数据:

> mtcars[2,]
              mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4

Rfast 中的nth 函数默认排序:

> sapply(mtcars, Rfast::nth, 2)
   mpg    cyl   disp     hp   drat     wt   qsec     vs     am   gear   carb 
10.400  4.000 75.700 62.000  2.760  1.615 14.600  0.000  0.000  3.000  1.000 

如果您对性能敏感,Rfast 版本通过使用部分排序来实现良好的扩展性,这不适用于基于 sortorderrank(包括 dplyr::nth)的解决方案.

【讨论】:

  • Rfast 有一个函数 colnth,它比使用 sapply 和 nth 还要快,但它要求您为每一列指定您希望获得的第 n 个值。
【解决方案2】:

这是我的例子;

num_func <- function(x, n) nth(sort(x), n)
sapply(dfchord, num_func, n = 2)  # edited (thanks for @thelatemail's comment)

【讨论】:

    【解决方案3】:

    既然你已经喜欢 dplyr,这就是我现在对 purrr 所做的事情:

    purrr::map_dbl(mtcars, ~nth(., 2, order_by = .))
       mpg    cyl   disp     hp   drat     wt   qsec     vs     am   gear   carb 
    10.400  4.000 75.700 62.000  2.760  1.615 14.600  0.000  0.000  3.000  1.000 
    

    或者只使用 dplyr,因为它已经为 nth() 加载:

    summarise_all(mtcars, funs(nth(., 2, order_by = .))
       mpg cyl disp hp drat    wt qsec vs am gear carb
    1 10.4   4 75.7 62 2.76 1.615 14.6  0  0    3    1
    

    【讨论】:

    • 无包 - mtcars[sapply(mtcars, rank, ties.method="first")==2]
    【解决方案4】:

    如果您正在寻找nthsort 的更快替代方案,CRAN 的“kit”包中有topn 函数。请查看文档。

    【讨论】:

      【解决方案5】:

      因此,这是在任何 data.frame 的列中获取任何第 n 个值的答案,您只需更改 y[x] 中的 x。

      x = dfchord
      
      for (i in (1:ncol(x))) {
        y = sort(x[,i], decreasing=FALSE)
        ans$small[i] = y[2] # this is the second biggest number, replace the value with whatever you want
        ans$rel = rownames(x)
      }
      
      answer = data.frame( 'nth' = ans$small, 'rel' = ans$rel)
      

      【讨论】:

        【解决方案6】:

        dplyr::summarize_each

        n <- 2
        dfchord %>% summarize_each(funs(nth(sort(.),n)))
        #          X5        X8       X13        X4       X17       X3        X9       X21       X16       X14        X2       X15        X1        X7
        # 1 0.5689322 0.5795683 0.3150177 0.3150177 0.6322464 0.868563 0.7046387 0.3582759 0.7252203 0.5163978 0.3651484 0.5163978 0.3582759 0.4222794
        #         X10      X40       X23       X25       X22      X20        X6      X18      X12       X39       X19       X11       X30       X34
        # 1 0.4222794 0.507107 0.6206017 0.4536844 0.4536844 0.654303 0.5126421 0.338204 0.338204 0.5126421 0.5393651 0.5804794 0.7270723 0.5242481
        #        X28       X31       X26       X29       X33       X24       X36      X37       X41       X27       X32       X35       X38
        # 1 0.735765 0.5242481 0.7270723 0.8749704 0.5715592 0.4933355 0.4933355 0.574123 0.7443697 0.6333863 0.6333863 0.7296583 0.6709442
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-01
          • 2021-03-04
          • 2022-12-14
          • 2011-08-16
          • 2020-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多