генерировать фрейм данных с отсутствующими значениями - PullRequest
1 голос
/ 15 марта 2020

Мне нужно добавить к существующему фрейму данных таким образом, чтобы, если в столбце c1 фрейма данных c1.b не было значений a1 вектора, нужно было генерировать это не существующее значение.

Пример:

#c1 dataframe and a1 vector

c1 <- data.frame(c1.a = c(1),c1.b = c("1a"),c1.c = c(3))

a1 <- c("1a","1b","1c")

фрейм данных, который необходимо сгенерировать, как показано ниже

df <- data.frame(matrix(0, nrow = 5, ncol = 3))
names(df) <- c("c1.a","c1.b","c1.c")

Здесь старый c1 фрейм данных имеет только «1a», присутствующий из вектора a1, а отсутствующие - 1b и 1 c. поэтому их нужно сгенерировать, как показано ниже.

Пожалуйста, помогите мне написать код.

> c1
   c1.a c1.b c1.c
1     1   1a    3
2     0   1b    0
3     0   1b    0
4     0   1b    0
5     0   1b    0
6     0   1b    0
7     0   1c    0
8     0   1c    0
9     0   1c    0
10    0   1c    0
11    0   1c    0

1 Ответ

1 голос
/ 15 марта 2020

Мы можем использовать setdiff, чтобы получить имена в 'a1', которые не являются столбцом 'c1.b' в 'c1', тогда rep лицензирует 'df' и 'v1' на основе длины 'v1' и rbind с оригинальным 'c1'

v1 <- setdiff(a1, c1$c1.b)
df1 <- df[rep(seq_len(nrow(df)), length(v1)),]
df1$c1.b <- rep(v1, each = nrow(df))
c1 <- rbind(c1, df1)
row.names(c1) <- NULL
c1
#   c1.a c1.b c1.c
#1     1   1a    3
#2     0   1b    0
#3     0   1b    0
#4     0   1b    0
#5     0   1b    0
#6     0   1b    0
#7     0   1c    0
#8     0   1c    0
#9     0   1c    0
#10    0   1c    0
#11    0   1c    0

или с использованием tidyverse

library(dplyr)
library(tidyr)
df %>%
      mutate(c1.b = list(setdiff(a1, c1$c1.b))) %>% 
      unnest(c(c1.b)) %>%
      bind_rows(c1, .)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...