Estou lutando para encontrar a função apropriada que retornaria um número especificado de linhas selecionadas aleatoriamente sem substituição de um quadro de dados na linguagem R? Alguém pode me ajudar?
333
Primeiro faça alguns dados:
> df = data.frame(matrix(rnorm(20), nrow=10))
> df
X1 X2
1 0.7091409 -1.4061361
2 -1.1334614 -0.1973846
3 2.3343391 -0.4385071
4 -0.9040278 -0.6593677
5 0.4180331 -1.2592415
6 0.7572246 -0.5463655
7 -0.8996483 0.4231117
8 -1.0356774 -0.1640883
9 -0.3983045 0.7157506
10 -0.9060305 2.3234110
Em seguida, selecione algumas linhas aleatoriamente:
> df[sample(nrow(df), 3), ]
X1 X2
9 -0.3983045 0.7157506
2 -1.1334614 -0.1973846
10 -0.9060305 2.3234110
?sample
no console do R para ler sobre essa função.set.seed(42)
) toda vez que quiser reproduzir essa amostra específica.sample.int
seria ligeiramente mais rápido do que eu acredito:library(microbenchmark);microbenchmark( sample( 10000, 100 ), sample.int( 10000, 100 ), times = 10000 )
A resposta que John Colby dá é a resposta certa. No entanto, se você é um
dplyr
usuário, também há a respostasample_n
:amostras aleatoriamente 10 linhas do quadro de dados. Chama
sample.int
, então realmente é a mesma resposta com menos digitação (e simplifica o uso no contexto de magrittr, pois o dataframe é o primeiro argumento).fonte
Escreva um! Embrulhar a resposta de JC me dá:
Agora melhore, verificando primeiro se n <= nrow (df) e parando com um erro.
fonte
O
data.table
pacote fornece a funçãoDT[sample(.N, M)]
, amostrando M linhas aleatórias da tabela de dadosDT
.fonte
Apenas por uma questão de integridade:
O dplyr também oferece desenhar uma proporção ou fração da amostra
Isso é muito conveniente, por exemplo, no aprendizado de máquina, quando você precisa fazer uma certa taxa de divisão, como 80%: 20%
fonte
EDIT : Esta resposta está desatualizada, veja a versão atualizada .
No meu pacote R, aprimorei
sample
para que agora se comporte como esperado também para quadros de dados:Isso é obtido criando
sample
um método genérico S3 e fornecendo a funcionalidade (trivial) necessária em uma função. Uma chamada parasetMethod
consertar tudo. A implementação original ainda pode ser acessadabase::sample
.fonte
sample.default(df, ...)
um quadro de dadosdf
, ele faz uma amostra das colunas do quadro de dados, pois um quadro de dados é implementado como uma lista de vetores do mesmo comprimento.install_github('kimisc', 'krlmlr')
e conseguiError: Does not appear to be an R package (no DESCRIPTION)
. Alguma maneira de contornar isso?[
operador para quadros de dados é um contra-exemplo. Além disso, diga-me: você já, apenas uma vez, usousample
amostras de colunas de um quadro de dados?iris[2]
funciona como uma lista, assim comoiris[[2]]
. Ouiris$Species
,lapply(iris, mean)
... Quadros de dados são listas. Então, espero que eles se comportem como eles. E sim, eu realmente usei sample (myDataframe). Em um conjunto de dados em que cada variável contém dados de expressão de um único gene. Seu método específico ajuda usuários iniciantes, mas também altera efetivamente a maneira comosample()
se comporta. Observe que eu uso "conforme o esperado" da exibição de um programador. O que é diferente da intuição geral. Há muito em R que não é compatível com a intuição geral ...;)No meu pacote R, existe uma função
sample.rows
apenas para este propósito:Melhorar
sample
tornando-a uma função S3 genérica foi uma má ideia, de acordo com comentários de Joris Meys a uma resposta anterior .fonte
Selecione uma amostra aleatória de um tipo de petisco em R:
nrow pega um petisco e retorna o número de linhas. O primeiro parâmetro transmitido para
sample
é um intervalo de 1 ao final da sua rifa. O segundo parâmetro passado para a amostra, 150, é quantas amostras aleatórias você deseja. A divisão entre colchetes especifica as linhas dos índices retornados. A variável 'a' obtém o valor da amostragem aleatória.fonte
Você pode fazer isso:
Acima acabei de criar um dataframe com 10 colunas e 100 linhas, ok?
Agora você pode experimentar com
sample_n
:fonte
Eu sou novo em R, mas estava usando esse método fácil que funciona para mim:
PS: Sinta-se à vontade para observar se há alguma desvantagem em que não estou pensando.
fonte
Você pode fazer isso:
fonte