如何在数据帧的特定命名列上使用`assign()`或`get()`?

bah*_*kev 4 r named dataframe assign

有没有办法为数据框中的特定列分配值?例如,

dat2 = data.frame(c1 = 101:149, VAR1 = 151:200)    
j = "dat2[,"VAR1"]"  ## or, j = "dat2[,2]"
assign(j,1:50)
Run Code Online (Sandbox Code Playgroud)

上述方法不起作用.这也不是:

j = "dat2"
assign(get(j)[,"VAR1"],1:50)
Run Code Online (Sandbox Code Playgroud)

mne*_*nel 13

假设我们有一个有效的 data.frame,每个都有50行

dat2 <- data.frame(c1 = 1:50, VAR1 = 51:100)
Run Code Online (Sandbox Code Playgroud)

1.不要使用assign,get如果你能避免它.

"dat2[,"VAR1"]"在...中无效R.

您也可以从帮助页面注意到这一点 assign

assign不调度赋值方法,因此它不能用于设置向量,名称,属性等元素.

请注意,对附加列表或数据框的分配会更改附加副本而不是原始对象:请参阅attach和with.

data.frame的列是列表的元素

你在寻找什么 [[<-

# assign the values from column (named element of the list) `VAR1`
j <- dat2[['VAR1']] 
Run Code Online (Sandbox Code Playgroud)

如果要将新值分配给VAR1内部dat2,

dat2[['VAR1']] <- 1:50
Run Code Online (Sandbox Code Playgroud)

你问题的答案......

使用get和完全使用字符串进行操作assign

assign('dat2', `[[<-`(get('dat2'), 'VAR1', value = 2:51))
Run Code Online (Sandbox Code Playgroud)

其他方法

data.table ::集

如果你想在一个data.frame或通过引用分配data.table(仅替换现有的列),那么setdata.table包中工作(即使data.frames)

library(data.table)
set(dat2, j = 'VAR1', value = 5:54)
Run Code Online (Sandbox Code Playgroud)

evalbquote

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))
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 5

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 ...
Run Code Online (Sandbox Code Playgroud)