2013-08-19 87 views
2

(編輯以反映幫助...我沒有做偉大的格式,但欣賞的反饋)重新編碼在多個數據幀

我卡在我懷疑什麼是很容易位問題。我有多個不同的數據集,我已經加載到R中,所有這些數據集都有不同數量的觀察值,但所有這些數據集都有兩個名爲「A1」,「A2」和「A3」的變量。如果A3包含大於零的值,並且如果A3包含小於零的值,則保留在「A2」中,我希望在包含「A1」中保存的值的三個數據幀中的每一箇中創建一個新變量。似乎很簡單,對吧?

我這段代碼嘗試使用這個虛假數據:

set.seed(1) 
A1=seq(1,100,length=100) 
A2=seq(-100,-1,length=100) 
A3=runif(100,-1,1) 
df1=cbind(A1,A2,A3) 

A3=runif(100,-1,1) 
df2=cbind(A1,A2,A3) 

我約百分之一千肯定的是,R擁有用於創建多個數據幀相同的命名變量的一些功能,但我已盡力用lapply做這個:

mylist=list(df1,df2) 
lapply(mylist,function(x){ 
    x$newVar=x$A1 
    x$newVar[x$A3>0]=x$A2[x$A3>0] 
    return(x) 
}) 

但是newVar不適用於我,一旦我離開lapply循環。例如,如果我要求新變量的平均值: mean(df1 $ newVar) [1]不適用 警告消息: 在mean.default(df1 $ newVar)中: 參數不是數字或邏輯:返回NA

任何幫助,將不勝感激。
謝謝。

回答

3

那麼首先,df1df2不是data.frames但矩陣(美元語法不適用於矩陣)。
事實上,如果你這樣做:

set.seed(1) 
A1=seq(1,100,length=100) 
A2=seq(-100,-1,length=100) 
A3=runif(100,-1,1) 
df1=as.data.frame(cbind(A1,A2,A3)) 

A3=runif(100,-1,1) 
df2=as.data.frame(cbind(A1,A2,A3)) 

mylist=list(df1,df2) 
lapply(mylist,function(x){ 
    x$newVar=x$A1 
    x$newVar[x$A3>0]=x$A2 
}) 

代碼幾乎的作品,但給出了一些警告。實際上,在由lapply調用的函數的最後一行中仍然存在錯誤。如果你改變它這個樣子,它按預期工作:

lapply(mylist,function(x){ 
    x$newVar=x$A1 
    x$newVar[x$A3>0]=x$A2[x$A3>0] # you need to subset x$A2 otherwise it's too long 
    return(x) # better to state explicitly what's the return value 
}) 

編輯(按評論):

爲基本上總是發生在R,功能不發生變異現有的對象,但回報全新的對象。
所以,在這種情況下df1df2仍然是相同的,但lapply返回一個列表與預期的2個新data.frames即:

resultList <- lapply(mylist,function(x){ 
    x$newVar=x$A1 
    x$newVar[x$A3>0]=x$A2[x$A3>0] 
    return(x) 
}) 

newDf1 <- resultList[[1]] 
newDf2 <- resultList[[2]] 
+0

謝謝你回去我這麼快,幫我脫身從錯誤。現在我有:' lapply(mylist,function(x){$ x newVar = x $ A1 x $ newVar [x $ A3> 0] = x $ A2 [x $ A3> 0] return(x) }) ' 但是當我稍後查看df1和df2時,它們仍然只有3個變量:A1,A2和A3。沒有「newVar」。 名稱(df1) [1]「A1」「A2」「A3」 我在做什麼不正確? – Molly

+0

@Molly:查看我的編輯;) – digEmAll

+0

完美!謝謝。 – Molly