通过 `assign` 将新列分配给数据框

assigning new columns to data frame via `assign`

所以我有这个数据框 df:

df<-data.frame(a=runif(10),b=sample(10),c=c(1,2,3,NA,1,2,1,4,5,3))

> head(df,2)
             a  b  c
1  0.503718016  4  1
2  0.253538589 10  2

所以对于以下情况:

 >df$a_new<-NA
 > head(df,2)
             a  b  c a_new
1  0.503718016  4  1  NA
2  0.253538589 10  2  NA

然后我想到了一个快速而肮脏的解决方案,即创建具有特殊名称的对象,例如:df$XXX_new 以及为什么不通过 assign 赋予值(当然 XXX 代表一个变量遍历名称向量,即 names(df):

for(ll in names(df))
  assign(paste0("df$",ll,"_new"),NA)

我期待 专栏出现在我的旧 df 中。事实并非如此。

>head(df)
             a  b  c a_new
1  0.503718016  4  1  NA
2  0.253538589 10  2  NA

是否可以解释为什么会发生这种情况?

assign中,第一个参数是'x'——这是一个以字符串形式给出的变量名。这里,"df" 是data.frame 的对象名称。作为第二个参数,我们将新变量分配给 value 即 NA

for(ll in names(df)) assign("df", `[<-`(df, paste0(ll, "_new"), value = NA))
head(df, 2)
#          a b c a_new b_new c_new
#1 0.2925740 7 1    NA    NA    NA
#2 0.2248911 4 2    NA    NA    NA

数据

set.seed(24)
df<-data.frame(a=runif(10),b=sample(10),c=c(1,2,3,NA,1,2,1,4,5,3))