Витяг конкретних стовпців з кадру даних


365

У мене є кадр даних R з 6 стовпцями, і я хочу створити новий кадр даних, у якого є лише три стовпці.

Припускаючи , що мій кадр даних df, і я хочу , щоб витягти колони A, Bі Eце єдина команда , яку я можу зрозуміти:

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

Чи є більш компактний спосіб зробити це?

Відповіді:


156

Використовуючи пакет dplyr , якщо ваш data.frame називається df1:

library(dplyr)

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

Це також можна записати без %>%труби як:

select(df1, A, B, E)

2
Враховуючи значно еволюцію Tidyverse з моменту опублікування мого запитання, я відповів вам на відповідь.
Арен Камбре

4
Враховуючи шалену швидкість змін у підводці, я б застерігсь від використання цього шаблону. Це на додаток до моїх сильних переваг щодо поводження з іменами стовпців так, ніби вони є іменами об'єктів під час написання коду для функцій, пакетів чи програм.
Джошуа Ульріх

1
Минуло більше чотирьох років з моменту подання цієї відповіді, і схема не змінилася. Трубні вирази можуть бути досить інтуїтивними, саме тому вони привабливі.
Арен Камбре

як мені виконати подальшу команду на цій підмножині? Наприклад, я хочу обчислити rowMean: "df1%>% rowMeans (виберіть (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не має цього недоліку.
Девід Дорчі

100

У цьому полягає 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]: недійсний тип підпису" список "" Але якщо 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"))]

працював на мене. Усі вищезазначені синтаксиси дали "вибрані невизначені стовпці".


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.



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.