Помещение повторяющегося значения в столбец - PullRequest
14 голосов
/ 23 августа 2011

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

например:

list1 <- c(1, 2, 3, 4, 5)
list2 <-c("2009-01-01")
list3 <-cbind(list2, list1)

Я хочу, чтобы ОДНА И ЖЕ была указана столько же раз, сколько существует точек данных, а затем объединена с точками данных.

date                number
"2009-01-01"          1
"2009-01-01"          2
"2009-01-01"          3
"2009-01-01"          4
"2009-01-01"          5

Когда я пытаюсь запустить приведенный выше код, я получаю сообщение о несоответствующих длинах.Любые предложения приветствуются.Спасибо.

Ответы [ 3 ]

14 голосов
/ 23 августа 2011

Отредактировано, чтобы мой комментарий к фрейму данных был более описательным.

Как насчет использования rep?

list1 <- 1:5
list2 <- rep("2009-01-01",length(list1))
list3 <- cbind(list2, list1)

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

list3 <- data.frame(date = list2, number = list1)

, поскольку cbind в вашем случае создаст матрицу символов, которая, поскольку матрицы должны быть только одного типа.

2 голосов
/ 23 августа 2011

Причина, по которой я пишу, несмотря на то, что вы подумали, что другой ответ был "идеальным", заключается в том, что cbind возвращает матрицу, которая, поскольку у вас был один вектор, который был "символом", полностью имеет тип "символ".

> str(list3)
 chr [1:5, 1:2] "2009-01-01" "2009-01-01" "2009-01-01" ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:2] "list2" "list1

Было бы лучше, если бы вы работали с данными смешанного типа (даты и числа), чтобы использовать data.frame. Он имеет функцию добавления, которую вам даже не нужно использовать rep (), поскольку перезапуск аргументов будет повторяться автоматически:

> data.frame(dt = as.Date("2009-01-01"), l1 = list1)
          dt l1
1 2009-01-01  1
2 2009-01-01  2
3 2009-01-01  3
4 2009-01-01  4
5 2009-01-01  5
1 голос
/ 23 августа 2011

cbind вернет фрейм данных, если один из аргументов является фреймом данных. В этом случае он просто действует как оболочка для data.frame [см. ?cbind].

В других ответах и ​​комментариях, где пользователи сказали, что cbind сработало, и это создало матрицу, они исключили, что матрица была символьной матрицей, а числа были объединены в символьные строки. Вы, вероятно, не хотели этого.

Одно из решений, которое еще не представлено, заключается в следующем:

vector1 <- c(1, 2, 3, 4, 5);
vector2 <- c("2009-01-01");
cbind(data.frame(date = vector2), number = vector1);

Это создает фрейм данных, потому что первый аргумент является фреймом данных.

Но, я думаю, что лучше всего, и тот, который действительно показывает, что вы знаете, что вы хотите, это позвонить data.frame напрямую:

data.frame(date = vector2, number = vector1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...