#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