如果我想讓變數的數字可訪問,例如在 for 回圈中,我可以使用 get 和assign:
for(i in 1:2){
assign(paste0('a',toString(i)),i*pi)
}
get('a2')
輸出
[1] 6.283185
但是如果我想對資料框做類似的事情怎么辦?
我想做類似的事情
df<-data.frame(matrix(ncol = 2,nrow = 3))
varnames <- c()
for(i in 1:2){
varnames <- c(varnames, paste0('a', toString(i)))
}
colnames(df) <- varnames
for(i in 1:2){
assign(paste0('df$a',toString(i)), rep(i*pi,3))
}
get(paste0('df$a',toString(2)))
但這實際上只是創建名為 的變數df$a1,df$a2而不是將 c(i*pi,i*pi,i*pi) 分配給資料框的列df
我真正想做的是能夠像這樣操作整列(單個條目):
for(i in 1:2){
for(j in 1:3)
assign(paste0('df$a',toString(i),'[',toString(j),']'), i*pi)
}
get(paste0('df$a',toString(2),'[2]'))
我可以在哪里得到df$a2[2].
我認為像 python 字典這樣的東西也可以。
uj5u.com熱心網友回復:
而不是assign,只需直接執行[
for(i in 1:2) df[[paste0('a', i)]] <- rep(i * pi, 3)
然后可以用
df[[paste0('a', 2)]][2]
[1] 6.283185
assign 可以使用,但是當我們更直接地這樣做時不推薦
for(i in 1:2) assign("df",`[[<-`(df, paste0('a', i), value = i * pi))
df[[paste0('a', 2)]][1]
[1] 6.283185
本get應是物件即“DF”上,而不是列,即
get('df')[[paste0('a', 2)]][1]
uj5u.com熱心網友回復:
首先,assign在全域環境中創建物件通常不是一個好主意。出于各種原因,您應該優先創建一個命名串列,其中最重要的是能夠迭代您創建的物件。
其次,注意代碼塊:
varnames <- c()
for(i in 1:2){
varnames <- c(varnames, paste0('a', toString(i)))
}
colnames(df) <- varnames
可以用單線代替:
colnames(df) <- paste0("a", 1:2)
最后,您應該利用 R 的矢量化和使用["colname"]符號進行子集化的能力。這完全不需要顯式回圈:
df[paste0("a", 1:2)] <- sapply(1:2, \(i) rep(i * pi, 3))
df
#> a1 a2
#> 1 3.141593 6.283185
#> 2 3.141593 6.283185
#> 3 3.141593 6.283185
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/353851.html
上一篇:從資料框中僅獲取唯一的行
