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

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

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

so860
источник
15

Где df1 - ваш исходный фрейм данных:

df2 <- subset(df1, select = c(1, 2, 5))
Ричард Болл
источник
7
Это не использовать dplyr. Он использует base::subsetи идентичен ответу Стефана Лорана за исключением того, что вы используете номера столбцов вместо имен столбцов.
Грегор Томас
14

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

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

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

Аман Бурман
источник
2

Вы можете использовать with:

with(df, data.frame(A, B, E))
Moody_Mudskipper
источник
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"))
)
FXi
источник
4
Нет, если вы установите drop=FALSE. Пример:df[,c("a"),drop=F]
до