2013-08-19 52 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