如何根据条件向数据框添加一行

How to add a row to data frame based on a condition

我有一个数据框,我想根据以下条件添加一行。条件是 column a 等于 Ccolumn b 等于 35

这是我的数据框

df <- data.frame(a = c("A", "B", "C", "D", "C", "A", "C", "E"), 
                 b = c(seq(8)), stringsAsFactors = TRUE)

每当条件为 TRUE 时,我想在满足条件 add 3 的下方添加一行。我尝试了以下

rbind(df, data.frame(a="add", b = "3"))
#     a b
# 1   A 1
# 2   B 2
# 3   C 3
# 4   D 4
# 5   C 5
# 6   A 6
# 7   C 7
# 8   E 8
# 9 add 3

这不是我想要的输出。我想要的输出是

#     a b
# 1   A 1
# 2   B 2
# 3   C 3
# 4 add 3   
# 5   D 4
# 6   C 5
# 7 add 3
# 8   A 6
# 9   C 7
# 10  E 8

我该怎么做?我是 R 的新手,感谢您的帮助。

lens = ifelse(df$b %in% c(3, 5) & df$a == "C", 2, 1)
ind = rep(1:NROW(df), lens)
df2 = df[ind,]
df2$a = as.character(df2$a)
df2$a[cumsum(lens)[which(lens == 2)]] = "add"
df2$b[cumsum(lens)[which(lens == 2)]] = 3
df2
#      a b
#1     A 1
#2     B 2
#3     C 3
#3.1 add 3
#4     D 4
#5     C 5
#5.1 add 3
#6     A 6
#7     C 7
#8     E 8

使用 tidyverse 包的解决方案。

library(tidyverse)

df2 <- df %>%
  mutate(Group = lag(cumsum(a == "C" & b %in% c(3, 5)), default = FALSE)) %>%
  group_split(Group) %>%
  map_dfr(~ .x %>% bind_rows(tibble(a = "add", b = 3))) %>%
  slice(-n()) %>%
  select(-Group)

df2
# # A tibble: 10 x 2
#    a         b
#    <chr> <dbl>
#  1 A         1
#  2 B         2
#  3 C         3
#  4 add       3
#  5 D         4
#  6 C         5
#  7 add       3
#  8 A         6
#  9 C         7
# 10 E         8

在 base R 中,我们可以找到 a = "c"b 为 3 或 5 的位置。在数据框中重复这些行并用所需值替换它们。

pos <- which(df$a == "C" & df$b %in% c(3, 5))
df <- df[sort(c(seq(nrow(df)), pos)), ]
df[seq_along(pos) + pos, ] <- list("add", 3)
row.names(df) <- NULL

df
#     a b
#1    A 1
#2    B 2
#3    C 3
#4  add 3
#5    D 4
#6    C 5
#7  add 3
#8    A 6
#9    C 7
#10   E 8

数据

df <- data.frame(a = c("A", "B", "C", "D", "C", "A", "C", "E"), 
                 b = c(seq(8)), stringsAsFactors = FALSE)