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
答案 0 :(得分:2)
在下面,我们使用点,但是您可以替换“。”可以使用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列和{{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)
一种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替换为空白。
答案 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