Как заполнить пропущенные значения в столбце и строке кадра данных на основе вектора в качестве источника - PullRequest
1 голос
/ 13 февраля 2020

У меня есть следующий фрейм данных:

library(dplyr)
library(tibble)

df <- tibble(
  source = c("a", "b", "b"),
  target = c("a", "b", "c"),
  score = c(10, 5, 3) ) %>%
  pivot_wider(names_from = target, values_from = score) %>%
  as.data.frame() %>%
  column_to_rownames(var = "source")


df

Это выглядит так

  a  b  c
a 10 NA NA
b NA  5  3

Теперь имена столбцов и строк являются неполными. Полные имена даны в этом векторе:

master_source_target <- c("a", "b","c","d")

Я хочу дополнить столбец и строку фрейма данных на основе этого вектора, чтобы в конце он выглядел так:

   a  b  c  d
a 10 NA NA  NA
b NA  5  3  NA
c NA  NA NA NA
d NA  NA NA NA

Как мне этого добиться?

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Сначала можно добавить отсутствующие имена столбцов, а затем rbind отсутствующие строки с помощью NA.

df[setdiff(master_source_target, names(df))] <- NA
rbind(df,matrix(NA, nrow = length(master_source_target) - nrow(df), ncol = ncol(df),
        dimnames = list(setdiff(master_source_target, rownames(df)), names(df))))

#   a  b  c  d
#a 10 NA NA NA
#b NA  5  3 NA
#c NA NA NA NA
#d NA NA NA NA
1 голос
/ 13 февраля 2020

Вы можете сделать это за один шаг:

df[setdiff(master_source_target, rownames(df)), master_source_target] <- NA

df
   a  b  c  d
a 10 NA NA NA
b NA  5  3 NA
c NA NA NA NA
d NA NA NA NA
1 голос
/ 13 февраля 2020

Проще с matrix из NA с, а затем выполнить присвоение на основе dimnames из 'df'

new <- matrix(NA, length(master_source_target), 
    length(master_source_target), 
       dimnames = list(master_source_target, master_source_target))
new[row.names(df), colnames(df)] <- unlist(df)
new
#   a  b  c  d
#a 10 NA NA NA
#b NA  5  3 NA
#c NA NA NA NA
#d NA NA NA NA

. В качестве ОП использовали tibble, мы можно также использовать tidyverse подходя от

library(tibble)
library(dplyr)
library(tidyr)
df %>% 
   rownames_to_column('rn') %>%
   pivot_longer(cols = -rn, values_drop_na = TRUE) %>%
   complete(rn = master_source_target, name = master_source_target) %>%
   pivot_wider(names_from = name, values_from = value) %>% 
   column_to_rownames('rn')

или с crossing и объединением

crossing(Var1 = master_source_target, Var2 = master_source_target) %>% 
   left_join(as.data.frame.table(as.matrix(df))) %>% 
   pivot_wider(names_from = Var2, values_from = Freq) %>%
   column_to_rownames('Var1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...