R 如何在一个数据帧内以编程方式分配一组变量

R 如何在一个数据帧内以编程方式分配一组变量,r,dataframe,variable-assignment,R,Dataframe,Variable Assignment,给定一个字符向量vars和一个数据帧列表d,我想 确保d中的每个数据帧都有vars中命名的所有列。 假设一个数据帧中缺少一些列,那么我创建 数据框中的这些列,并用NAs填充它们 但是,当我使用assign执行此操作时,会得到一些奇怪的结果: > vars <- c('y','z') > b <- data.frame(a=1:3, b=3:1) > b a b 1 1 3 2 2 2 3 3 1 > within(b, for (v in vars) as

给定一个字符向量
vars
和一个数据帧列表
d
,我想 确保
d
中的每个数据帧都有
vars
中命名的所有列。 假设一个数据帧中缺少一些列,那么我创建 数据框中的这些列,并用
NA
s填充它们

但是,当我使用
assign
执行此操作时,会得到一些奇怪的结果:

> vars <- c('y','z')
> b <- data.frame(a=1:3, b=3:1)
> b
  a b
1 1 3
2 2 2
3 3 1
> within(b, for (v in vars) assign(v, NA))
  a b  z  y v
1 1 3 NA NA z
2 2 2 NA NA z
3 3 1 NA NA z
>变量b
a b
1 1 3
2 2 2
3 3 1
>在(b)范围内,对于(v在变量中)赋值(v,NA))
a b z y v
1 1 3 NA NA z
2 NA NA z
3 3 1 NA NA z
您可以看到,我使用此方法创建了
z
y
列, 但是还有一本额外的书,我不知道它是从哪里来的。

试试这个:

missingCols <- setdiff(vars, names(b))
naColumn <- function(x)rep(NA, nrow(b))

cbind(b, sapply(missingCols, naColumn, USE.NAMES=TRUE))

  a b  y  z
1 1 3 NA NA
2 2 2 NA NA
3 3 1 NA NA
missingCols您也可以尝试:

list2env(split(rep(NA,2*nrow(b)),vars),envir=.GlobalEnv)
 cbind(b,mget(vars))
#   a b  y  z
# 1 1 3 NA NA
# 2 2 2 NA NA
# 3 3 1 NA NA


下面是使用
数据。表

require(data.table) ## 1.9.2+
setDT(b)            ## convert data.frame to data.table
set(b, j=vars, value=NA_integer_)

#    a b  y  z
# 1: 1 3 NA NA
# 2: 2 2 NA NA
# 3: 3 1 NA NA
注意
数据中的所有
设置*
功能。表
(和
:=
运算符)通过引用操作,这意味着此处没有(不必要的)复制

如果您想使用
data.frame
,只需将其转换回
data.frame
。在(当前的开发版本)中,有一个函数
setDF
,用于通过引用从
data.table
返回
data.frame
(与传统的
as.data.frame(.)
函数相反,后者将生成副本)

把它们放在一起(如果你想在末尾有一个
data.frame


再一次,没有制作(深度)副本。

这里有一个简单的方法,它符合原始代码的精神

for(v in vars) { b[[v]] <- NA }
您还可以使
vars
包含所有变量,并只获取您希望与
setdiff
一起保留的变量

vars <- c('a','b','y','z')
b <- data.frame(a=1:3, b=3:1)
for(v in setdiff(vars, names(b))) { b[[v]] <- NA }
vars
for(v in vars) { b[[v]] <- NA }
within(b, {for (v in vars) assign(v, NA); rm(v) })
vars <- c('a','b','y','z')
b <- data.frame(a=1:3, b=3:1)
for(v in setdiff(vars, names(b))) { b[[v]] <- NA }