假设我们有一个 有效 data.frame,每个数据帧有 50 行
dat2 <- data.frame(c1 = 1:50, VAR1 = 51:100)
1 .如果可以避免,请不要使用assign 和get。
"dat2[,"VAR1"]" 在R 中无效。
您也可以从assign 的帮助页面中注意到这一点
assign 不分派赋值方法,因此不能用于
设置向量、名称、属性等元素。
请注意,分配给附加列表或数据框会更改
附加副本而不是原始对象:请参阅附加和与。
data.frame 的一列是列表的一个元素
你要找的是[[<-
# assign the values from column (named element of the list) `VAR1`
j <- dat2[['VAR1']]
如果您想在dat2 中为VAR1 分配新值,
dat2[['VAR1']] <- 1:50
你的问题的答案......
使用get 和assign 完全使用字符串进行操作
assign('dat2', `[[<-`(get('dat2'), 'VAR1', value = 2:51))
其他方法
data.table::set
如果您想在data.frame 或data.table 中通过引用进行分配(仅替换现有列),那么data.table 包中的set 可以工作(即使使用data.frames)
library(data.table)
set(dat2, j = 'VAR1', value = 5:54)
eval 和 bquote
dat1 <- data.frame(x=1:5)
dat2 <- data.frame(x=2:6)
for(x in sapply(c('dat1','dat2'),as.name)) {
eval(bquote(.(x)[['VAR1']] <- 2:6))
}
eapply
或者如果你使用单独的环境
ee <- new.env()
ee$dat1 <- dat1
ee$dat2 <- dat2
# eapply returns a list, so use list2env to assign back to ee
list2env(eapply(ee, `[[<-`, 'y', value =1:5), envir = ee)