假设我们有一个有效的数据框,每个数据框有50行
dat2 <- data.frame(c1 = 1:50, VAR1 = 51:100)
1. 如果可以避免,不要使用 assign
和 get
。
"dat2[,"VAR1"]"
在 R
中无效。
您也可以从 assign
的帮助页面中注意到这一点
assign 不分派赋值方法,因此不能用于设置向量、名称、属性等的元素。
请注意,对附加列表或数据框的赋值会更改所附加的副本,而不是原始对象:请参见 attach 和 with。
数据框的列是列表的一个元素
你要找的是 [[<-
# 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)
foo='VAR1'; dat2[,foo]<-1:50
替代,并且仍然可以传递你的字符串。 - Justin