Вставьте пустую строку до нуля - PullRequest
1 голос
/ 09 октября 2019
x<-c(0,1,1,0,1,1,1,0,1,1)
aaa<-data.frame(x)

Как вставить пустую строку перед нулем? Когда первая строка равна нулю, не добавляйте пустую строку. Спасибо.

Результат:

0
1
1
.
0
1
1
1
.     
0
1
1

Ответы [ 5 ]

2 голосов
/ 09 октября 2019

Ниже мы использовали точку, но вы можете заменить "."с 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)), ]
1 голос
/ 09 октября 2019
Возможны

One dplyr и tidyr:

aaa %>%
 uncount(ifelse(row_number() > 1 & x == 0, 2, 1)) %>%
 mutate(x = ifelse(x == 0 & lag(x == 1, default = first(x)), NA_integer_, x))

    x
1   0
2   1
3   1
4  NA
5   0
6   1
7   1
8   1
9  NA
10  0
11  1
12  1

Пустая строка не добавляется, поскольку у вас есть числовой вектор. Вместо этого он добавляет строку с NA. Если вам нужна пустая строка, вы можете преобразовать ее в символьный вектор, а затем заменить NA пустой.

1 голос
/ 09 октября 2019
ind = with(aaa, ifelse(x == 0 & seq_along(x) > 1, 2, 1))
d = aaa[rep(1:NROW(aaa), ind), , drop = FALSE]
transform(d, x = replace(x, sequence(ind) == 2, NA))
0 голосов
/ 11 октября 2019

Мое решение -

 aaa <- data.frame(x = c(0,1,1,0,1,1,1,0,1,1), y = letters[1:10])
 aaa$ind = with(aaa, ifelse(x == 0 & seq_along(x) > 1, 2, 1))
 aaa<-aaa[rep(1:nrow(aaa), aaa$ind), ,]
 aaa[(aaa$ind== 2 & !grepl(".1",rownames(aaa))),]<-NA
 aaa$ind<- NULL 
 aaa
      x    y
 1    0    a
 2    1    b
 3    1    c
 4   NA <NA>
 4.1  0    d
 5    1    e
 6    1    f
 7    1    g
 8   NA <NA>
 8.1  0    h
 9    1    i
 10   1    j
0 голосов
/ 09 октября 2019
 data.frame(x = unname(unlist(by(aaa$x,cumsum(aaa==0),c,'.'))))
   x
1  0
2  1
3  1
4  .
5  0
6  1
7  1
8  1
9  .
10 0
11 1
12 1
13 .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...