在零之前插入空白行

时间:2019-10-09 15:36:55

标签: r

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

6 个答案:

答案 0 :(得分:2)

在下面,我们使用点,但是您可以替换“。”可以使用NA或“”或其他取决于您想要的内容。

1)我们可以使用Reduceappend

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上附加点行,然后使用unlistMap创建索引向量以访问扩展的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列和{{1} }的最后一行被rep(...)替换。

c(".", NA)

答案 1 :(得分:1)

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))

答案 2 :(得分:1)

一种dplyrtidyr的可能性是:

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替换为空白。

答案 3 :(得分:0)

这里是rleid

的一个选项
library(data.table)
setDT(aaa)[,  .(x = if(x[.N] == 1) c(x, NA) else x), rleid(x)][-.N, .(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

答案 4 :(得分:0)

 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 .

答案 5 :(得分:0)

我的解决方法是

 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