Как добавить строку во фрейм данных на основе условия - PullRequest
3 голосов
/ 06 октября 2019

У меня есть фрейм данных, в который я хочу добавить строку на основе следующих условий. Условия: когда column a равно C и column b равно 3 или 5.

Вот мой фрейм данных

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 и благодарю вас за помощь.

Ответы [ 3 ]

4 голосов
/ 06 октября 2019
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
3 голосов
/ 06 октября 2019

Решение с использованием пакета 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
2 голосов
/ 06 октября 2019

В базе 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...