2013-09-23 5 views
0

Я играю с R-кадрами данных и пытаюсь выяснить, как они работают. В примере ниже я пытаюсь использовать фрейм данных с 1 строкой для удаления элементов вектора. Я знаю, что есть намного лучшие способы сделать это, например unique(), или использовать хэш-библиотеку и т. Д. И т. Д. Это больше о том, как работает DataFrame.Динамические столбцы в R-кадрах данных

Это первая часть работает просто отлично, если добавляется имя столбца строка:

> v = c(1, 2, 3, 10, 100, 50, 50, 100, 1, 2, 3, 10) 
> d = data.frame(row.names=c('the row')) 
> d 
data frame with 0 columns and 1 rows 
> for (x in v) { d[1,as.character(x)] = x} 
> d 
     1 2 3 10 100 50 
the row 1 2 3 10 100 50 

Однако, если я пытаюсь использовать номер в качестве имени столбца, я получаю очень странное поведение:

> e = data.frame(row.names=c('the row')) 
> for (x in v) { e[1,x] = x} 
Error in `[<-.data.frame`(`*tmp*`, 1, x, value = 10) : 
    new columns would leave holes after existing columns 
> e 
     V1 V2 V3 
the row 1 2 3 

Прежде всего, откуда взялись «V1», «V2» и «V3»? Во-вторых, почему это не работает? Я имею в виду, я могу разобраться в том, что это не радует, что 10 не является следующим числом после 3, но кроме этого я не знаю, почему это не работает.

Являются ли столбцы индексируемыми только как строки? Другие ограничения, о которых стоит знать?

Заранее благодарен!

+0

Просто примечание: в вашем первом примере 'd [," 10 "]' и 'd [, 4]' относятся к тому же столбцу. –

+0

'? Data.frame' имеет ссылку на'? Make.names', что, вероятно, поможет. – Gregor

+2

Вы ответили на свой вопрос: '[<-. Data.frame' не будет расширять кадр данных более чем на один столбец за раз. Поскольку 'e [, 10]' относится к 10-му столбцу, и у вас только 3, не нужно идти. – joran

ответ

1

Чтобы ответить, где V1, V2, V3 имена берутся, проверьте исходный код '[<-.data.frame', строка 139:

> deparse(`[<-.data.frame`)[139] 
[1] "    new.cols <- paste0(\"V\", seq.int(from = nvars + " 

Относительно того, почему не e[1,10] = 10 работать, когда e имеет только три колонки, ну, это просто Безразлично «т. И если вы считаете, что это противоречит вашему предыдущему результату (d), введите d[,4] и посмотрите, что произойдет.

+0

Хорошо, между этим ответом и комментариями, я думаю, что у меня есть лучшее понимание. По-видимому, концептуально, по крайней мере, более полезно думать о кадрах данных как о двумерном массиве/векторе (в общем смысле, а не в R, не знаю, использует ли R эти термины), который поддерживает сопоставление имен с индексы для строк и столбцов; имена столбцов доступны через имена() и имена строк, доступные через (wait it ...) row.names(). Похоже, что списки (как в списке()) похожи, но одномерные. Спасибо за помощь, много еды для размышлений! – retnuH

+0

@retnuH Вид. Кадры данных предназначены для хранения «двумерных» структур данных, но они довольно буквально перечислены. Двухтомный аспект к ним - это просто абстракция, предоставляемая структурой данных, и '['. Кадры данных являются буквально подклассом списков, где каждый элемент должен иметь одинаковую длину. Но запустите 'is.list' в кадре данных. Кроме того, обратите внимание, что с некоторыми усилиями вы можете сломать эту абстракцию. «Столбцы» кадров данных сами по себе могут быть списком кадров данных! – joran

Смежные вопросы