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?

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)

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")]

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

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

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".



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.



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)

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"))
)

4
Não se você definir drop=FALSE. Exemplo:df[,c("a"),drop=F]
até
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.