Как заполнить R-фрейм данными с именованными векторами различной длины?

#r #dataframe

Вопрос:

Мне нужно заполнить R data.frame (или data.table), используя именованные векторы в качестве строк. Проблема в том, что именованные векторы, используемые в качестве строк, обычно не содержат всех переменных. Другими словами, обычно именованный вектор имеет меньшую длину, чем количество столбцов. Имена переменных в векторах совпадают с именами столбцов фрейма данных:

 df <- data.frame(matrix(NA, 2, 3))
colnames(df) <- c("A", "B", "C")
obs1 <- c(A=2, B=4)
obs2 <- c(A=3, C=10)
 

Я хочу, чтобы df выглядел следующим образом:

 > df
  A  B  C
1 2  4 NA
2 3 NA 10
 

Поэтому я хочу заполнить первые две строки obs1 и obs2 соответственно. Когда я пытаюсь это сделать, я получаю сообщение об ошибке:

 > df[1,] <- obs1
Error in `[<-.data.frame`(`*tmp*`, 1, , value = c(A = 2, B = 4)) : 
  replacement has 2 items, need 3
 

Я подозреваю, что подобный вопрос уже задавался, но я не смог его найти. Кто-нибудь знает, как это сделать с помощью data.frame или data.table?

Ответ №1:

Нам также нужно выбрать столбцы на основе names «obs1» и «obs2»

 df[1, names(obs1)] <- obs1
df[2, names(obs2)] <- obs2
 

-выход

 > df
  A  B  C
1 2  4 NA
2 3 NA 10
 

Когда мы это делаем df[1,] , он возвращает первую строку со всеми столбцами, т. Е. length 3, где «obs1» или «obs2» имеют длину только 2, что приводит к ошибке в длине


Кроме того, создание набора данных шаблона для заполнения на самом деле не требуется, так как мы можем использовать bind_rows его, который будет автоматически заполняться NA для тех столбцов, которых нет

 library(dplyr)
bind_rows(obs1, obs2)
# A tibble: 2 x 3
      A     B     C
  <dbl> <dbl> <dbl>
1     2     4    NA
2     3    NA    10
 

Ответ №2:

решение с data.table ;

 library(data.table)
obs1 <- data.table(t(obs1))
obs2 <- data.table(t(obs2))
df <- rbindlist(list(obs1,obs2),fill=T)
df
 

выход;

       A     B     C
  <dbl> <dbl> <dbl>
1     2     4    NA
2     3    NA    10