Извлечение определенных столбцов из фрейма данных


366

У меня есть фрейм данных R с 6 столбцами, и я хочу создать новый фрейм данных, который имеет только три столбца.

Предполагая , что мой кадр данных df, и я хочу , чтобы извлечь колонны A, Bи Eэто единственная команда , которую я могу понять:

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

Есть ли более компактный способ сделать это?

Ответы:


157

Используя пакет dplyr , если ваш data.frame вызывается df1:

library(dplyr)

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

Это также может быть записано без %>%трубы как:

select(df1, A, B, E)

2
Учитывая значительную эволюцию Tidyverse с момента публикации моего вопроса, я переключил ответ вам.
Арен Камбре

4
Учитывая бешеную скорость изменений в тидиверсе, я бы предостерег от использования этого паттерна. Это в дополнение к моему сильному предпочтению не рассматривать имена столбцов, как если бы они были именами объектов при написании кода для функций, пакетов или приложений.
Джошуа Ульрих

1
Прошло более четырех лет с тех пор, как этот ответ был представлен, и схема не изменилась. Трубные выражения могут быть довольно интуитивными, поэтому они привлекательны.
Арен Камбре

Как выполнить дальнейшую команду на этом подмножестве? Например, я хочу вычислить rowMean: «df1%>% rowMeans (select (A, B, E))» не работает.
Бен

Вы бы цепь вместе трубопровода , как: df1 %>% select(A, B, E) %>% rowMeans(.). Смотрите документацию по %>%трубе, набрав?magrittr::`%>%`
Сэм Фирке

448

Вы можете подмножество, используя вектор имен столбцов. Я настоятельно предпочитаю этот подход по сравнению с теми, которые обрабатывают имена столбцов, как если бы они были именами объектов (например subset()), особенно при программировании в функциях, пакетах или приложениях.

# 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
Это дает ошибку object of type 'closure' is not subsettable.
Арен Камбре

24
@ArenCambre: тогда ваш data.frame на самом деле не назван df. dfтакже является функцией в пакете статистики.
Джошуа Ульрих


2
@Cina: Потому -"A"что это синтаксическая ошибка. И ?Extractговорит, « , также могут быть отрицательные целые числа, указывающие на элементы / ломтиков выйти из выбора.» ij...
Джошуа Ульрих

7
Существует проблема с этим синтаксисом , потому что если мы извлечь только один столбец R, возвращает вектор вместо dataframe , и это может быть нежелательным: > df[,c("A")] [1] 1. Использование subsetне имеет этого недостатка.
Дэвид Доркис

101

Это роль subset()функции:

> 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

Когда я пытаюсь сделать это с моими данными, я получаю сообщение об ошибке: «Ошибка в x [j]: недопустимый тип индекса« list »» Но если c («A», «B») не является списком, что это такое? ?
Rafael_Espericueta

@Rafael_Espericueta Трудно угадать без просмотра кода ... Но c("A", "B")это вектор, а не список.
Стефан Лоран

Это преобразовать фрейм данных в список.
Суат Атан, доктор философии,

78

Есть два очевидных варианта: Джошуа Ульрих df[,c("A","B","E")]или

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

как в

> 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

Только по какой-то причине

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

работал на меня. Все вышеперечисленные синтаксисы дали «неопределенные выбранные столбцы».



14

Вы также можете использовать sqldfпакет, который выполняет выборку для фреймов данных R:

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

Это дает в качестве вывода фрейм данных df1со столбцами: A, B, E.



1
df<- dplyr::select ( df,A,B,C)

Кроме того, вы можете назначить другое имя для вновь создаваемых данных

data<- dplyr::select ( df,A,B,C)

0

[ и подмножество не заменяемы:

[ возвращает вектор, если выбран только один столбец.

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
Нет, если вы установите drop=FALSE. Пример:df[,c("a"),drop=F]
до
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.