R 在零之前插入一个空行

R 在零之前插入一个空行,r,R,一个dplyr和tidyr可能性可能是: 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)) 它不是添加一个空行,因为您有一个数字向量。相反,它添加了一行NA。如果需要一个空行,可以将其转换为字符向量,然后将NA替换为空白

一个
dplyr
tidyr
可能性可能是:

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

它不是添加一个空行,因为您有一个数字向量。相反,它添加了一行NA。如果需要一个空行,可以将其转换为字符向量,然后将NA替换为空白。

一个
dplyr
tidyr
可能性可能是:

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

它不是添加一个空行,因为您有一个数字向量。相反,它添加了一行NA。如果您需要一个空行,可以将其转换为字符向量,然后将NA替换为空白。

下面我们使用了点,但您可以根据需要将“.”替换为NA或“”或其他内容

1)我们可以使用
Reduce
append

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
3)我们可以创建一个两行矩阵,其中第一行是0前面的点,否则为NA。然后将其分解为向量,并使用na.omit删除na值

data.frame(x = strsplit(gsub("(.)0", "\\1.0", paste(aaa$x, collapse = "")), "")[[1]])
4)我们可以在aaa$x[-1]上重叠输出c(“.”,9)或1。取消该列表并重新插入aaa$x[1]。没有使用任何软件包

data.frame(x = na.omit(c(rbind(replace(ifelse(aaa$x == 0, ".", NA), 1, NA), aaa$x))))
repl <- function(x) if (!x) c(".", 0) else 1
data.frame(x = c(aaa$x[1], unlist(lapply(aaa$x[-1], repl))))
6)假设
aaa
有两列,其中第二列为字符(非因子)。将一行点添加到
aaa
,然后使用
unlist
Map
创建索引向量,以访问扩展
aaa
的相应行

L <- as.list(aaa$x[-1])
L[x[-1] == 0] <- list(c(".", 0))
data.frame(x = c(aaa$x[1], unlist(L)))

下面我们使用了点,但您可以根据需要将“.”替换为NA或“”或其他内容

1)我们可以使用
Reduce
append

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
3)我们可以创建一个两行矩阵,其中第一行是0前面的点,否则为NA。然后将其分解为向量,并使用na.omit删除na值

data.frame(x = strsplit(gsub("(.)0", "\\1.0", paste(aaa$x, collapse = "")), "")[[1]])
4)我们可以在aaa$x[-1]上重叠输出c(“.”,9)或1。取消该列表并重新插入aaa$x[1]。没有使用任何软件包

data.frame(x = na.omit(c(rbind(replace(ifelse(aaa$x == 0, ".", NA), 1, NA), aaa$x))))
repl <- function(x) if (!x) c(".", 0) else 1
data.frame(x = c(aaa$x[1], unlist(lapply(aaa$x[-1], repl))))
6)假设
aaa
有两列,其中第二列为字符(非因子)。将一行点添加到
aaa
,然后使用
unlist
Map
创建索引向量,以访问扩展
aaa
的相应行

L <- as.list(aaa$x[-1])
L[x[-1] == 0] <- list(c(".", 0))
data.frame(x = c(aaa$x[1], unlist(L)))

这里有一个带有
rleid

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

这里有一个带有
rleid

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)), ]
我的解决办法是

 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 .
aaa(1,2,1))
aaa我的解决方案是

 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 .
aaa(1,2,1))

aaa0 1 1 NA 0 1 1 NA 0 1 1如果在此处。是NA,请你给我一个简单的方法,非常感谢。假设显示的向量是输入,那么答案中的备选方案(1)有效。假设y是字符列,而不是因子,我们在这里添加了6.0 1 1 NA 0 1 1 NA 0 1 1 1。是NA,请给我一个简单的方法,非常感谢。假设显示的向量是输入,那么答案中的备选方案(1)有效。X假设y是字符列,而不是因子,我们添加了6.xx