如何用不同长度的命名向量填充R数据帧



我需要使用命名向量作为行来填充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吗?

我们还需要根据"obs1"one_answers"obs2"的names来选择列

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

带有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

最新更新