Ниже мы использовали точку, но вы можете заменить "."с NA или "" или чем-то еще, в зависимости от того, что вы хотите.
1) Мы можем использовать Reduce
и append
:
Append <- function(x, y) append(x, ".", y - 1)
data.frame(x = Reduce(Append, setdiff(rev(which(aaa$x == 0)), 1), init = aaa$x))
2) gsub Другая возможность - преобразовать в строку символов, использовать gsub
и преобразовать обратно:
data.frame(x = strsplit(gsub("(.)0", "\\1.0", paste(aaa$x, collapse = "")), "")[[1]])
3) Мы можем создать матрицу из двух строк вкоторый первая строка является точкой перед каждым 0 и NA в противном случае. Затем расправьте его с вектором и используйте na.omit для удаления значений NA.
data.frame(x = na.omit(c(rbind(replace(ifelse(aaa$x == 0, ".", NA), 1, NA), aaa$x))))
4) Мы можем смириться с aaa $ x [-1], выводя c (". ", 9) или 1. Удалите список и вставьте aaa $ x [1] обратно. Пакеты не используются.
repl <- function(x) if (!x) c(".", 0) else 1
data.frame(x = c(aaa$x[1], unlist(lapply(aaa$x[-1], repl))))
5) Создайте список всех, кроме первогоэлемент и замените 0 в этом списке на c(".", 0)
. Снимите этот список и вставьте первый элемент обратно. Пакеты не используются.
L <- as.list(aaa$x[-1])
L[x[-1] == 0] <- list(c(".", 0))
data.frame(x = c(aaa$x[1], unlist(L)))
6) Предполагается, что aaa
имеет два столбца, в которых второй столбец является символом (НЕ фактор). Добавьте строку точек к aaa
, а затем создайте индексный вектор, используя unlist
и Map
, чтобы получить доступ к соответствующей строке расширенного aaa
.
aaa <- data.frame(x = c(0,1,1,0,1,1,1,0,1,1), y = letters[1:10],
stringsAsFactors = FALSE)
nr <- nrow(aaa); nc <- ncol(aaa)
fun <- function(ix, x) if (!is.na(x) & x == 0 & ix > 1) c(nr + 1, ix) else ix
rbind(aaa, rep(".", nc))[unlist(Map(fun, 1:nr, aaa$x)), ]
Если мы хотим получитьy
будьте фактором, тогда отметьте, что мы не можем просто добавить точку к фактору, если это не уровень этого фактора, поэтому возникает вопрос о том, какие уровни может иметь фактор. Чтобы обойти это, давайте добавим NA, а не точку к фактору. Затем мы получаем следующее, то же самое, за исключением того, что aaa
было переопределено, так что y
является фактором, нам больше не нужен nc
, так как мы предполагаем 2 столбца, а rep(...)
в последней строке заменяется наc(".", NA)
.
aaa <- data.frame(x = c(0,1,1,0,1,1,1,0,1,1), y = letters[1:10])
nr <- nrow(aaa)
fun <- function(ix, x) if (!is.na(x) & x == 0 & ix > 1) c(nr + 1, ix) else ix
rbind(aaa, c(".", NA))[unlist(Map(fun, 1:nr, aaa$x)), ]