Em R com uma matriz:
one two three four
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 11 18
[4,] 4 9 11 19
[5,] 5 10 15 20
Quero extrair a submatriz cujas linhas têm a coluna três = 11. Ou seja:
one two three four
[1,] 1 6 11 16
[3,] 3 8 11 18
[4,] 4 9 11 19
Eu quero fazer isso sem loop. Eu sou novo no R, então isso provavelmente é muito óbvio, mas a documentação geralmente é um pouco concisa.
[ ]
as respostas e você verá isso mais claramente.Respostas:
Isso é mais fácil se você converter sua matriz em um quadro de dados usando as.data.frame (). Nesse caso, as respostas anteriores (usando subconjunto ou m $ três) funcionarão, caso contrário, não funcionarão.
Para executar a operação em uma matriz , você pode definir uma coluna pelo nome:
Ou pelo número:
Observe que, se apenas uma linha corresponder, o resultado será um vetor inteiro, não uma matriz.
fonte
m[m[,3] == 11,,drop=FALSE]
df <- df[!which(df$ARID3A:df$YY1 == "U"),]
, aqui eu quero remover as linhas do meu df, onde uma gama de colunas (ARID3A: YY1) contém o valor U .O comando a seguir selecionará a primeira linha da matriz acima.
E isso selecionará os três últimos.
O resultado será uma matriz nos dois casos. Se você deseja usar nomes de coluna para selecionar colunas, é melhor convertê-lo em um dataframe com
Então você pode selecionar com
Ou você pode usar o comando subconjunto.
fonte
Vou escolher uma abordagem simples usando o pacote dplyr.
Se o quadro de dados for dados.
fonte
Subconjunto é uma função muito lenta e, pessoalmente, acho inútil.
Eu suponho que você tem uma data.frame, matriz, matriz chamada
Mat
comA
,B
,C
como nomes de coluna; então tudo que você precisa fazer é:No caso de uma condição em uma coluna, digamos a coluna A
No caso de várias condições em uma coluna diferente, você pode criar uma variável dummy. Suponha que as condições são
A = 10
,B = 5
eC > 2
, em seguida, temos:Ao testar a vantagem da velocidade
system.time
, owhich
método é 10x mais rápido que osubset
método.fonte
Se sua matriz for chamada
m
, basta usar:fonte
df <- df[!which(df$ARID3A:df$YY1 == "U"),]
, aqui eu quero remover as linhas do meu df, onde uma gama de colunas (ARID3A: YY1) contém o valorU
Se o conjunto de dados é chamado de dados, todas as linhas que atendem a uma condição em que o valor da coluna 'pm2.5'> 300 pode ser recebido por:
dados [dados ['pm2.5']> 300,]
fonte