2016-10-20 71 views
3

我剛剛在R中編程(或根本不懂),而且我幾天都遇到了一個問題。道歉,如果這個問題已經以某種形式存在,但我已盡最大努力,無法找到任何東西。R中的賦值函數子集數據

我有多個數據集稱爲pop1,pop2,pop3等,我試圖從for循環內爲它們的指定子集分配一個零值。經過反覆試驗,我發現代碼:

subset(get(paste("pop", 1, sep = "")), ind == 46, select = -ind) 

返回我要找的子集,但是當我嘗試:

for (i in 1:3) { 
    assign(subset(get(paste("pop", i, sep = "")), ind == 46, select = -ind), 0) 
} 

我得到的錯誤信息:

#Error in assign(subset(get(paste("pop", i, sep = "")), ind == 46, select = -ind), : 
    #invalid first argument 

在我看來,assign函數不會將子集作爲它的第一個參數,因爲以下任何一項都不是:

assign(pop1[46, -1], 0) 
assign(pop1$trait1, 0) 
assign(subset(pop1, ind == 46), 0) 

有沒有辦法讓這項工作?非常感謝,並讓我知道更多的信息會有所幫助。

+2

將所有彈出對象放入列表對象,然後使用lapply以避免「分配」問題。 – zx8754

+1

一個技巧是創建一個命令字符串並使用'eval(parse(text = yourtext))'。 'a < - matrix(1:6,3,2)'然後'eval(parse(text = sprintf(「%s [%d,%d] < - 0」,「a」,1,1)) )'。在智能手機上輸入R碼很困難。 – chan1142

回答

2

正如評論中提到的那樣,通過列表更容易完成這些任務。

您可以將所有數據集保存在列表中。然後使用常規的子設置,您可以定期進行分配。

df1=data.frame(a=1:10,b=c(1,2)) 
df2=data.frame(a=1:10,b=c(1,2)) 
l=list(df1,df2) 
lapply(l, function(x) { x[which(x[,2]==1),2]=999; return(x)}) 

如果你喜歡在循環中這樣做,那麼可以使用解析和eval一起使用。

for(i in 1:2){ 
    txt=paste('df',i,'[df',i,'[,2]==1,2]','=999', sep = "") 
    eval(parse(text = txt)) 
} 
+0

非常感謝!我無法得到我所需要的工作,因爲我有很多其他的東西在for循環中,我無法在lapply中工作(我不是說這不可能,但我無法),但我現在通過創建一個函數來對數據進行子集化,從而獲得了我原來的目的,非常感謝! –

+0

我明白你的擔心,所以這裏是你可以使用的for循環。 –