5

データ フレーム内の特定の列に値を割り当てる方法はありますか? 例えば、

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

2 に答える 2

16

それぞれに50行の有効なdata.frameがあると仮定しましょう

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

1. 回避できる場合は使用しないでくださいassignget

"dat2[,"VAR1"]"では無効ですR

これは、のヘルプ ページからも確認できます。assign

assign は代入メソッドをディスパッチしないため、ベクトル、名前、属性などの要素の設定には使用できません。

アタッチされたリストまたはデータ フレームへの代入は、元のオブジェクトではなく、アタッチされたコピーを変更することに注意してください: attach および with を参照してください。

data.frame の列はリストの要素です

あなたが探しているのは[[<-

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

VAR1内に新しい値を割り当てたい場合はdat2

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

あなたの質問への答えは....

とを使用して文字列を使用して完全に操作するにgetassign

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

その他のアプローチ

data.table::セット

data.frameor内で参照によって割り当てる場合data.table(既存の列のみを置き換える) 、パッケージsetから(でも)data.tabledata.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)

于 2013-03-27T22:04:35.497 に答える
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 ...
于 2013-03-27T23:09:13.950 に答える