Как случайным образом выбрать строку в кадре данных, для которого асимметрия строк больше заданного значения в R - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь выбрать случайные строки из фрейма данных с 1000 строками (и шестью столбцами), где асимметрия линии больше заданного значения (скажем, Sk> 0,3).

Я сгенерировал следующий фрейм данных

df=data.frame(replicate(6,sample(10:100,1000,rep=TRUE)))

Я могу получить асимметрию строк из пакета fbasics:

rowSkewness(df) дает:

   [8] -0.2243295435  0.5306809351  0.0707122386  0.0341447417  0.3339384838 -0.3910593364 -0.6443905090
  [15]  0.5603809206  0.4406091534 -0.3736108832  0.0397860038  0.9970040772 -0.7702547535  0.2065830354 

Но теперь мне нужно выбрать, скажем, 10 строк df, у которых длина строки больше, чем, скажем, 0,1 ... Может с

for (a in 1:10) {
  sample.data[a,] = sample(x=df[wich(rowSkewness(df[sample(1:nrow(df),1)>0.1),], size = 1, replace = TRUE)
}

или что-то вроде этого?

Любые мысли по этому поводу будут оценены. заранее спасибо.

Ответы [ 3 ]

1 голос
/ 23 октября 2019

вы можете использовать функцию sample_n () или sample_frac () - делает вашу версию немного короче:

library(tidyr)
library(fBasics)
df=data.frame(replicate(6,sample(10:100,1000,rep=TRUE)))
x=df %>% dplyr::filter(rowSkewness(df)>0.1)  %>% dplyr::sample_n(10)
1 голос
/ 23 октября 2019

Просто сделайте подмножество:

res1 <- DF[fBasics::rowSkewness(DF) > .1, ]

head(res1)
#    X1 X2 X3 X4 X5 X6
# 7  56 28 21 93 74 24
# 8  33 56 23 44 10 12
# 12 29 19 29 38 94 95
# 13 35 51 54 98 66 10
# 14 12 51 24 23 36 68
# 15 50 37 81 22 55 97

Или с e1071::skewness:

res2 <- DF[apply(as.matrix(DF), 1, e1071::skewness) > .1, ]

stopifnot(all.equal(res1, res2))

Данные

set.seed(42); DF <- data.frame(replicate(6, sample(10:100, 1000, rep=TRUE)))
1 голос
/ 23 октября 2019

Понял:

x=df %>% filter(rowSkewness(df)>0.1)
for (a in 1:samplesize) {
  sample.data[a,] = sample(x=x, size = 1, replace = TRUE)
}
...