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 }