如何使用`分配()`或`得到()`在数据帧的具体指定的列?(How to use `assign()

2019-08-18 02:09发布

是否有一个值分配给一个数据帧中的特定列的方法吗? 例如,

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)

Answer 1:

让我们假设我们有一个在每50行的有效 data.frame

dat2 <- data.frame(c1 = 1:50, VAR1 = 51:100)

1。 不要使用assignget ,如果你能避免它。

"dat2[,"VAR1"]"是不是在有效R

您也可以从帮助页面注意此assign

分配不调度分配方法,所以它不能被用来设置矢量,名称,属性等的元素

需要注意的是分配到连接列表或数据帧改变附加副本而不是原始对象:详见附与。

一个data.frame的列是一个列表的元素

你所寻找的是[[<-

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

如果你想分配给新值VAR1dat2

dat2[['VAR1']] <- 1:50

在回答你的问题....

要完全操纵使用字符串使用getassign

assign('dat2', `[[<-`(get('dat2'), 'VAR1', value = 2:51))

其他方法

data.table ::集

如果你想通过参考内分配data.framedata.table (只更换现有列),然后setdata.table包工程(即使data.frames

library(data.table)
set(dat2, j = 'VAR1', value = 5:54)

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))
}

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)



Answer 2:

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 ...


文章来源: How to use `assign()` or `get()` on specific named column of a dataframe?