2017-01-17 8 views
3

Я хочу найти n-е наименьшее число для каждого столбца в data.frame.N-е наименьшее значение для каждого столбца в data.frame в R

В приведенном ниже примере я указываю фактически второе наименьшее значение, используя функцию 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 
+0

Это звучит как немного странным, что нужно сделать. Чтобы сделать это более читаемым для себя и ваших коллег в будущем, вы можете захотеть [расплавить] (http://seananderson.ca/2013/10/19/reshape.html), а затем [split-apply-comb] (http://stackoverflow.com/questions/26664644/use-dplyrs-group-by-to-perform-split-apply-combine) – citynorman

ответ

1

Это мой пример;

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

@ thelatemail; Вы правы, спасибо. – cuttlefish44

0

Так вот это ответ, чтобы получить какое-либо п--й значения в столбцах любого data.frame вам нужно всего лишь изменить й в y [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) 
1

Поскольку вы уже как 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 
+1

Без пакетов - 'mtcars [sapply (mtcars, rank, ties.method =" first ") == 2]' – thelatemail

1

Только предупреждение , если вы не указали заказ для dplyr's 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 

nth функция Rfast делает сортировку по умолчанию:

> 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 была написана для масштабирования, используя часть , что неверно для решений на основе sort, order или rank (включая dplyr::nth).

0

С 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