Filtrando um quadro de dados

12

Ainda aprendendo funções básicas em R, a função de subconjunto parece filtrar apenas uma condição com base em uma única coluna com ou sem várias condições?

Como filtrar facilmente dados de um quadro de dados?

  1. quando você recebe várias condições

  2. Quando a condição precisar ser aplicada nas colunas disponíveis.

Exemplo: dado um quadro de dados contendo

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

digamos que quero filtrar esse quadro de dados para que apenas nomes onde D1 a D4 seja um 'E', eu deveria ter,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

Digamos que o D1 possa ser uma grande lista de colunas, como ou qual é a abordagem recomendada para executar esse filtro? Obrigado

eastafri
fonte

Respostas:

26

Se você deseja combinar vários filtros na função de subconjunto , use operadores lógicos:

 subset(data, D1 == "E" | D2 == "E")

selecionará as linhas para as quais a coluna D1 ou a coluna D2 tem o valor "E". Veja as páginas de ajuda para operadores lógicos disponíveis:

 > ?"|"

Para sua segunda pergunta, o que você precisa é filtrar as linhas. Isso pode ser alcançado da seguinte maneira

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

O primeiro argumento a ser aplicado fornece as colunas nas quais precisamos filtrar. O segundo argumento é 1, o que significa que estamos fazendo um loop pelas linhas dos dados. O terceiro argumento é uma função de linha única sem nome que retorna VERDADEIRO se "E" estiver presente na linha e FALSO se o "E" não estiver presente.

O resultado da função aplicar será o vetor lógico sel , que tem o comprimento igual ao número de linhas nos dados. Em seguida, usamos esse vetor para selecionar as linhas necessárias.

Atualizar

O mesmo pode ser alcançado com o grep:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

em R grep com argumentos padrão retorna o número de elementos no vetor fornecido que possuem o padrão correspondente.

mpiktas
fonte
2
outra função útil é any. Por exemplo, se você quiser verificar se pelo menos um elemento de um vetor é, = 10você pode escrever ( any(v==10)).
Nico
@nico sim, mas 10% em% v tem 9 caracteres e variante com qualquer 10 :). Embora para vetores numéricos seja melhor usar a igualdade, pois R é inteligente e se seus dados forem números inteiros misturados com números reais, ele reconhecerá corretamente que você possui 10 em seu conjunto de dados.
Mcktas
e o caso da expressão regular? assumindo que você não deseja trabalhar com uma correspondência exata? Eles têm algo parecido com ~ = como em outros idiomas? o que é mais próximo a este termo em R
eastafri
@Biorelated Consulte grepe agrepdocumentação relacionada no POSIX 1003.2 ou no regex compatível com Perl.
chl 12/01
@ Biorelated, atualizei a resposta com o exemplo de grep.
Mcktas