有没有办法为数据框中的特定列分配值?例如,
dat2 = data.frame(c1 = 101:149, VAR1 = 151:200)
j = "dat2[,"VAR1"]" ## or, j = "dat2[,2]"
assign(j,1:50)
上面的方法不起作用。这也不是:
j = "dat2"
assign(get(j)[,"VAR1"],1:50)
让我们假设我们有一个有效的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']]
如果您想为VAR1
within分配新值dat2
,
dat2[['VAR1']] <- 1:50
get
使用和完全使用字符串进行操作assign
assign('dat2', `[[<-`(get('dat2'), 'VAR1', value = 2:51))
如果您想在data.frame
or中通过引用进行分配data.table
(仅替换现有列),set
则从data.table
包中有效(即使使用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)
set2 <- function(x, val) {
eval.parent(substitute(x <- val))
}
> dat2 = data.frame(c1 = 101:150, VAR1 = 151:200)
> set2(dat2[["VAR1"]], 1:50)
> str(dat2)
'data.frame': 50 obs. of 2 variables:
$ c1 : int 101 102 103 104 105 106 107 108 109 110 ...
$ VAR1: int 1 2 3 4 5 6 7 8 9 10 ...