Добавить указанное количество пустых строк в таблицу данных, не перезаписывая заголовок - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь создать большую пустую таблицу данных со строкой заголовка, чтобы добавить значения в определенных местах после ее настройки.Я смог продублировать первую строку, а затем очистить каждую вторую строку или каждую строку, но я хотел бы очистить каждую строку после строки заголовка.Некоторые столбцы являются числовыми, а некоторые - символьными.

[input3]:

headers: header1 header2 header3..... header 60+

Values:   NA      NA       NA   ...     NA

Дублирующаяся строка:

input3 <- input2[rep(1:nrow(input2), each = 2), ]

Очистить каждую строку:

input3[1:nrow(input3) %% 1 == 0, ] <- NA

Но если я попытаюсьпереписать, что при дублировании пустых строк, начиная со строки 2 (чтобы сохранить заголовок), я получаю эту ошибку:

input3[2:nrow(input3) %% 1 == 0, ] <- NA

"Ошибка в [.data.table (x, i, которая = ИСТИНА): i оценивается какдлина логического вектора 9, но есть 10 строк. Переработка логического i больше не разрешена, поскольку она скрывает больше ошибок, чем стоит редкое удобство. Явно используйте rep (..., length = .N), если вам действительно нужно перезапускать."

Мне нужно иметь возможность динамически добавлять строки, сохраняя заголовок, так как это будет гигантская таблица, которую я экспортирую в другую программу.

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

1 Ответ

0 голосов
/ 28 января 2019

Вместо этого используйте

input3[c(FALSE,2:nrow(input3) %% 1 == 0,] <- NA

Используя 2:nrow, вы явно указали сокращенный вектор.Когда эта вещь является логическим вектором, она должна быть длина 1 или равна количеству строк.Период.

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

input3[which(2:nrow(input3) %% 1 == 0),] <- NA

"Хорошо" этогоявляется то, что which(...) возвращает вектор integer, поэтому он не должен быть такой же длины, как число строк в фрейме / таблице.

From ?Extract (включая [ и друзья):

      For '['-indexing only: 'i', 'j', '...' can be logical
      vectors, indicating elements/slices to select.  Such vectors
      are recycled if necessary to match the corresponding extent.
      'i', 'j', '...' can also be negative integers, indicating
      elements/slices to leave out of the selection.

«Переработка» - это то, почему длина 1 работает: ее логическое значение используется для всех строк.Если вы используете длину 2, а количество строк четное (например, mtcars[c(T,F),]), то это даст все остальные строки.Аналогичным образом, если вы предполагаете переработку, а количество строк не равно четному (например, mtcars[c(T,F,F),]), ваши предположения станут менее ясными.

Добавьте к этому поведение data.table, гдеэто не обеспечивает соблюдение этого.Переработка может привести к неприятностям, поэтому data.table не поощряет ее.

library(data.table)
mt <- as.data.table(mtcars)
mt[c(T,F),] <- NA
# Error in `[.data.table`(x, i, which = TRUE) : 
#   i evaluates to a logical vector length 2 but there are 32 rows. Recycling of logical i is no longer allowed as it hides more bugs than is worth the rare convenience. Explicitly use rep(...,length=.N) if you really need to recycle.
mt[c(1,3),] <- NA
...