【问题标题】:How to use `assign()` or `get()` on specific named column of a dataframe?如何在数据框的特定命名列上使用`assign()`或`get()`?
【发布时间】:2013-03-18 04:53:12
【问题描述】:

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

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)

【问题讨论】:

  • 您需要详细说明为什么要这样做。你可以改用foo='VAR1'; dat2[,foo]<-1:50,如果你很感动,仍然可以传递你的字符串。
  • 为什么? -- 创建一堆任意命名的数据框,并在其中填充特定的列。我知道最好为此使用列表结构;但是,有其他选择会很有用。
  • @baha-kev -- 我已经编辑了我的回复。

标签: r dataframe assign named


【解决方案1】:

假设我们有一个 有效 data.frame,每个数据帧有 50 行

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

1 .如果可以避免,请不要使用assignget

"dat2[,"VAR1"]"R 中无效。

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

assign 不分派赋值方法,因此不能用于 设置向量、名称、属性等元素。

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

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

你要找的是[[&lt;-

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

如果您想在dat2 中为VAR1 分配新值,

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

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

使用getassign 完全使用字符串进行操作

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

其他方法

data.table::set

如果您想在data.framedata.table 中通过引用进行分配(仅替换现有列),那么data.table 包中的set 可以工作(即使使用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)

【讨论】:

  • 别忘了dat[, "VAR1"]
  • @krlmlr -- 我更喜欢 [[&lt;- 进行单个作业。
  • 请记住,我的问题的重点与获取/分配有关——换句话说,我想通过字符值命名和引用数据框。我认为set() 会以这种方式工作,只需将set(dat2, ...) 替换为set(get(), ...)。谢谢。
  • @baha-kev -- set 不会创建列,只会替换现有列中的值
  • 嗯? set 不是基本或推荐的 R 包中的函数。
【解决方案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 ...

【讨论】:

    猜你喜欢
    • 2020-10-10
    • 2021-10-08
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2019-08-25
    相关资源
    最近更新 更多