фильтрации столбцов кадров данных на основе вектора в цикле [дубликат]

274
задан Aren Cambre 20 September 2013 в 17:35
поделиться

8 ответов

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

library(dplyr)

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

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

select(df1, A, B, E)
38
ответ дан Sam Firke 18 August 2018 в 15:51
поделиться
  • 1
    Учитывая значительную эволюцию Tidyverse после публикации моего вопроса, я переключил ответ на вас. – Aren Cambre 16 August 2018 в 13:58

[ и подмножество не подменяются:

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

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"))
)
0
ответ дан fxi 18 August 2018 в 15:51
поделиться

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

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

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

10
ответ дан Gilad Green 18 August 2018 в 15:51
поделиться

Есть два очевидных варианта: Joshua Ulrich 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
53
ответ дан Henry 18 August 2018 в 15:51
поделиться

Да, есть.

# 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")]
369
ответ дан Joshua Ulrich 18 August 2018 в 15:51
поделиться
  • 1
    Это дает ошибку object of type 'closure' is not subsettable. – Aren Cambre 10 April 2012 в 03:48
  • 2
    @ArenCambre: тогда ваш data.frame на самом деле не назван df. df также является функцией в пакете статистики. – Joshua Ulrich 10 April 2012 в 03:58
  • 3
  • 4
    @Cina: Потому что -"A" является синтаксической ошибкой. И ?Extract говорит: «i, j, ... также могут быть отрицательными целыми числами, указывая на элементы / срезы, чтобы они не выходили из выбора». – Joshua Ulrich 27 June 2015 в 14:43
  • 5
    Существует проблема с этим синтаксисом, потому что, если мы извлекаем только один столбец R, возвращает вектор вместо фрейма данных, и это может быть нежелательным: > df[,c("A")] [1] 1. Использование subset не имеет этого недостатка. – David Dorchies 27 July 2016 в 13:49

Снова используя dplyr, где df1 - ваш исходный фрейм данных:

df2 <- subset(df1, select = c(1, 2, 5))
9
ответ дан Richard Ball 18 August 2018 в 15:51
поделиться
  • 1
    Это не использует dplyr. Он использует base::subset и совпадает с ответом Стефана Лорана , за исключением того, что вместо имен столбцов вы используете номера столбцов. – Gregor 12 October 2017 в 18:16

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

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

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

5
ответ дан so860 18 August 2018 в 15:51
поделиться

Это роль функции 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
81
ответ дан Uli Köhler 18 August 2018 в 15:51
поделиться
  • 1
    Когда я пытаюсь это сделать, с моими данными, я получаю ошибку: & quot; Ошибка в x [j]: недопустимый индекс «список» & quot; Но если c («A», «B») не является списком, что это такое? – Rafael_Espericueta 28 November 2016 в 19:04
  • 2
    @Rafael_Espericueta Трудно догадаться, не просматривая ваш код ... Но c("A", "B") - это вектор, а не список. – Stéphane Laurent 28 November 2016 в 19:19
  • 3
    Он преобразует фрейм данных в список. – Suat Atan PhD 21 June 2017 в 09:42
Другие вопросы по тегам:

Похожие вопросы: