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