如何向R的data.frame中填充长度不一的命名向量作为行?
问题解决方法
报错是因为直接给整行赋值时,R要求替换值的长度和数据框列数一致,只要调整赋值逻辑,仅给命名向量包含的列对应位置赋值即可,未指定的列会自动保留原有NA值,以下是两种常用实现方案:
1. 原生data.frame实现
# 初始代码 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[1, names(obs1)] <- obs1 df[2, names(obs2)] <- obs2
运行后输出的df就是预期结果:
A B C 1 2 4 NA 2 3 NA 10
2. data.table实现
配合:=赋值语法即可,注意右侧要转成列表格式匹配多列赋值要求:
library(data.table) dt <- data.table(matrix(NA, 2, 3)) setnames(dt, c("A", "B", "C")) obs1 <- c(A=2, B=4) obs2 <- c(A=3, C=10) # 逐行赋值 dt[1, names(obs1) := as.list(obs1)] dt[2, names(obs2) := as.list(obs2)]
批量赋值优化
如果需要填充的观测向量很多,可以把所有向量放到列表中循环赋值:
obs_all <- list(obs1, obs2) for (row_idx in seq_along(obs_all)) { current_obs <- obs_all[[row_idx]] df[row_idx, names(current_obs)] <- current_obs }
内容的提问来源于stack exchange,提问作者Moysey Abramowitz
相关产品推荐
相关产品推荐

