Extraindo colunas específicas de um quadro de dados

366

Eu tenho um quadro de dados R com 6 colunas e quero criar um novo quadro de dados que tenha apenas três das colunas.

Supondo que o meu quadro de dados é df, e eu quero colunas extrato A, Be E, este é o único comando que eu possa descobrir:

 data.frame(df$A,df$B,df$E)

Existe uma maneira mais compacta de fazer isso?

Aren Cambre
fonte

Respostas:

157

Usando o pacote dplyr , se o seu data.frame for chamado df1:

library(dplyr)

df1 %>%
  select(A, B, E)

Isso também pode ser escrito sem o %>%pipe como:

select(df1, A, B, E)
Sam Firke
fonte
2
Dada a evolução considerável do Tidyverse desde a publicação da minha pergunta, troquei a resposta para você.
Aren Cambre
4
Dada a furiosa taxa de mudança no sentido inverso, eu recomendaria não usar esse padrão. Isso é um acréscimo à minha forte preferência contra o tratamento de nomes de colunas como se fossem nomes de objetos ao escrever código para funções, pacotes ou aplicativos.
Joshua Ulrich
11
Faz mais de quatro anos que essa resposta foi enviada e o padrão não mudou. Expressões canalizadas podem ser bastante intuitivas, e é por isso que elas são atraentes.
Aren Cambre
como executo um comando adicional para esse subconjunto? Por exemplo, eu quero calcular o rowMean: "df1%>% rowMeans (selecione (A, B, E))" não funciona.
Ben
Você tinha encadear um oleoduto como: df1 %>% select(A, B, E) %>% rowMeans(.). Consulte a documentação do %>%?magrittr::`%>%`
canal
448

Você pode definir um subconjunto usando um vetor de nomes de colunas. Eu prefiro fortemente essa abordagem sobre aquelas que tratam nomes de colunas como se fossem nomes de objetos (por exemplo subset()), especialmente quando programando em funções, pacotes ou aplicativos.

# data for reproducible example
# (and to avoid confusion from trying to subset `stats::df`)
df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5])
# subset
df[,c("A","B","E")]
Joshua Ulrich
fonte
4
Isso dá o erro object of type 'closure' is not subsettable.
Aren Cambre
24
@ArenCambre: então seu data.frame não é realmente chamado df. dftambém é uma função no pacote de estatísticas.
Joshua Ulrich
2
@ China: Porque -"A"é um erro de sintaxe. E ?Extractdiz, " , também pode ser inteiros negativos, indicando elementos / fatias de deixar de fora da seleção." ij...
Joshua Ulrich
7
Há um problema com esta sintaxe porque se extrair apenas uma coluna R, retorna um vetor em vez de uma trama de dados e isso pode ser indesejada: > df[,c("A")] [1] 1. O uso subsetnão tem essa desvantagem.
David Dorchies
100

Este é o papel da subset()função:

> dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> subset(dat, select=c("A", "B"))
  A B
1 1 3
2 2 4
Stéphane Laurent
fonte
Quando tento isso, com meus dados, recebo o erro: "Erro em x [j]: tipo de subscrito inválido 'lista'" Mas se c ("A", "B") não é uma lista, o que é isso? ?
Rafael_Espericueta 28/11
@Rafael_Espericueta Difícil de adivinhar sem visualizar seu código ... Mas c("A", "B")é um vetor, não uma lista.
Stéphane Laurent
Ele converte o quadro de dados em lista.
precisa saber é o seguinte
78

Existem duas opções óbvias: a de Joshua Ulrich df[,c("A","B","E")]ou

df[,c(1,2,5)]

como em

> df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> df
  A B C D E F
1 1 3 5 7 8 9
2 2 4 6 7 8 9
> df[,c(1,2,5)]
  A B E
1 1 3 8
2 2 4 8
> df[,c("A","B","E")]
  A B E
1 1 3 8
2 2 4 8
Henry
fonte
16

Por alguma razão apenas

df[, (names(df) %in% c("A","B","E"))]

trabalhou para mim. Todas as sintaxes acima produziram "colunas indefinidas selecionadas".

so860
fonte
15

Onde df1 é seu quadro de dados original:

df2 <- subset(df1, select = c(1, 2, 5))
Richard Ball
fonte
7
Isso não usa dplyr. Ele usa base::subsete é idêntico à resposta de Stephane Laurent, exceto que você usa números de coluna em vez de nomes de colunas.
Gregor Thomas
14

Você também pode usar o sqldfpacote que executa seleções nos quadros de dados R como:

df1 <- sqldf("select A, B, E from df")

Isso fornece como saída um quadro de dados df1com colunas: A, B, E.

Aman Burman
fonte
2

Você pode usar with:

with(df, data.frame(A, B, E))
Moody_Mudskipper
fonte
1
df<- dplyr::select ( df,A,B,C)

Além disso, você pode atribuir um nome diferente aos dados recém-criados

data<- dplyr::select ( df,A,B,C)
Mohamed Rahouma
fonte
0

[ e subconjunto não são substituíveis:

[ retorna um vetor se apenas uma coluna estiver selecionada.

df = data.frame(a="a",b="b")    

identical(
  df[,c("a")], 
  subset(df,select="a")
) 

identical(
  df[,c("a","b")],  
  subset(df,select=c("a","b"))
)
fxi
fonte
4
Não se você definir drop=FALSE. Exemplo:df[,c("a"),drop=F]
até