Как удалить столбцы из data.frame? - PullRequest
37 голосов
/ 16 августа 2011

Не так много "Как ты ...?" но больше "Как ты ...?"

Если у вас есть файл, который кто-то дает вам с 200 столбцами, и вы хотите сократить его до нескольких, необходимых для анализа, как вы поступите с этим? Одно решение предлагает преимущества перед другим?

Предполагается, что у нас есть фрейм данных со столбцами col1, col2 - col200. Если вы хотите только 1-100, а затем 125-135 и 150-200, вы можете:

dat$col101 <- NULL
dat$col102 <- NULL # etc

или

dat <- dat[,c("col1","col2",...)]

или

dat <- dat[,c(1:100,125:135,...)] # shortest probably but I don't like this

или

dat <- dat[,!names(dat) %in% c("dat101","dat102",...)]

Что-то еще, что мне не хватает? Я знаю, что это явно субъективно, но это одна из тех мрачных вещей, в которые вы можете погрузиться и начать делать это одним способом и впасть в привычку, когда есть намного более эффективные пути. Как и этот вопрос о , который .

EDIT:

Или, есть ли простой способ создать работоспособный вектор имен столбцов? name (dat) не печатает их с запятыми между ними, что вам нужно в приведенных выше примерах кода, поэтому, если вы распечатываете имена таким образом, у вас есть пробелы везде и вам нужно вручную ставить запятые ... Есть ли команда, которая даст вам "col1", "col2", "col3", ... в качестве вывода, чтобы вы могли легко получить то, что вы хотите?

Ответы [ 11 ]

1 голос
/ 16 августа 2011

Просто обращаюсь к редактированию.

@ nzcoops, вам не нужно имена столбцов в символьном векторе, разделенном запятыми. Вы думаете об этом неправильно. Когда вы делаете

vec <- c("col1", "col2", "col3")

вы создаете вектор символов. , просто разделяет аргументы, принимаемые функцией c(), когда вы определяете этот вектор. names() и аналогичные функции возвращают символьный вектор имен.

> dat <- data.frame(col1 = 1:3, col2 = 1:3, col3 = 1:3)
> dat
  col1 col2 col3
1    1    1    1
2    2    2    2
3    3    3    3
> names(dat)
[1] "col1" "col2" "col3"

Гораздо проще и менее подвержено ошибкам выбирать из элементов names(dat), чем обрабатывать его вывод в разделенную запятыми строку, из которой вы можете вырезать и вставить.

Скажем, нам нужны столбцы col1 и col2, подмножество names(dat), сохраняя только те, которые мы хотим:

> names(dat)[c(1,3)]
[1] "col1" "col3"
> dat[, names(dat)[c(1,3)]]
  col1 col3
1    1    1
2    2    2
3    3    3

Вы можете делать то, что хотите, но R всегда печатает вектор на экране в кавычках ":

> paste('"', names(dat), '"', sep = "", collapse = ", ")
[1] "\"col1\", \"col2\", \"col3\""
> paste("'", names(dat), "'", sep = "", collapse = ", ")
[1] "'col1', 'col2', 'col3'"

так что последний может быть более полезным. Тем не менее, теперь вы должны вырезать и пройти из этой строки. Гораздо лучше работать с объектами, которые возвращают то, что вы хотите, и использовать стандартные подпрограммы для сохранения того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...