Сдвиг строки влево на основе значения столбца - PullRequest
0 голосов
/ 08 марта 2019

Я работаю с большим фреймом данных (более 30000 наблюдений с 20 переменными), поэтому я не могу транспонировать свой фрейм данных.Для некоторых строк некоторые столбцы смещены справа от столбца класса Date, но столбцы слева от столбца класса Date не смещены.Я попытался написать заявление if, основанное на столбце, где происходит сдвиг, но я не могу обернуться вокруг него.Вот пример кода:

structure(list(Site = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("1", "2", "3"), class = "factor"), 
Vial = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L), Date = structure(c(15156, 15156, 15156, 
15156, 15156, 15156, 15156, 15156, 15156, 15156, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, 15156, 15156, 15156, 15156, 
15156, 15156, 15156, 15156, 15156, 15156), class = "Date"), 
Value_1 = c("a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "2011-07-01", "2011-07-01", "2011-07-01", "2011-07-01", 
"2011-07-01", "2011-07-01", "2011-07-01", "2011-07-01", "2011-07-01", 
"2011-07-01", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a"), Value_2 = c("b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b"), Value_3 = c("c", 
"c", "c", "c", "c", "c", "c", "c", "c", "c", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c", 
"c", "c", "c", "c", "c"), Value_4 = c(NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, "c", "c", "c", "c", "c", "c", "c", "c", 
"c", "c", "d", "d", "d", "d", "d", "d", "d", "d", "d", "d"
)), row.names = c(NA, -30L), class = "data.frame")

Обратите внимание, что последний столбец содержит NA, но также и значения.

1 Ответ

1 голос
/ 08 марта 2019

Я снова призываю исправить вышестоящий процесс .Тем временем этот хак должен пока работать "достаточно хорошо".

nadate <- is.na(x$Date)
newdate <- as.Date(x$Value_1[nadate])
newnotna <- !is.na(newdate)
x$Date[nadate] <- newdate[newnotna]
ind <- seq(which(colnames(x) == "Date") + 1L, ncol(x) - 1L)
x[nadate & newnotna, ind] <- x[nadate & newnotna, ind + 1L]
x[nadate & newnotna, ncol(x)] <- NA
x
#    Site Vial       Date Value_1 Value_2 Value_3 Value_4
# 1     1    1 2011-07-01       a       b       c    <NA>
# 2     1    2 2011-07-01       a       b       c    <NA>
# 3     1    3 2011-07-01       a       b       c    <NA>
# 4     1    4 2011-07-01       a       b       c    <NA>
# 5     1    5 2011-07-01       a       b       c    <NA>
# 6     1    6 2011-07-01       a       b       c    <NA>
# 7     1    7 2011-07-01       a       b       c    <NA>
# 8     1    8 2011-07-01       a       b       c    <NA>
# 9     1    9 2011-07-01       a       b       c    <NA>
# 10    1   10 2011-07-01       a       b       c    <NA>
# 11    2    1 2011-07-01       a       b       c    <NA>
# 12    2    2 2011-07-01       a       b       c    <NA>
# 13    2    3 2011-07-01       a       b       c    <NA>
# 14    2    4 2011-07-01       a       b       c    <NA>
# 15    2    5 2011-07-01       a       b       c    <NA>
# 16    2    6 2011-07-01       a       b       c    <NA>
# 17    2    7 2011-07-01       a       b       c    <NA>
# 18    2    8 2011-07-01       a       b       c    <NA>
# 19    2    9 2011-07-01       a       b       c    <NA>
# 20    2   10 2011-07-01       a       b       c    <NA>
# 21    3    1 2011-07-01       a       b       c       d
# 22    3    2 2011-07-01       a       b       c       d
# 23    3    3 2011-07-01       a       b       c       d
# 24    3    4 2011-07-01       a       b       c       d
# 25    3    5 2011-07-01       a       b       c       d
# 26    3    6 2011-07-01       a       b       c       d
# 27    3    7 2011-07-01       a       b       c       d
# 28    3    8 2011-07-01       a       b       c       d
# 29    3    9 2011-07-01       a       b       c       d
# 30    3   10 2011-07-01       a       b       c       d

Это должно быть достаточно стабильно: если запускаться несколько раз на одних и тех же данных, он больше ничего не должен делать.Если столбец $Date не равен NA, то сдвиг не предпринимается.Если $Value_1 не анализируется как дата, ничего не смещается.

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