2010-07-29 45 views
0

在循环中,我试图将类因子的列向量转换为数字。引用循环内的数据帧中的列向量

如果没有一个循环中,代码看起来像

c1$values <- as.numeric(as.character(c1$values)) 

但是我怎么引用C1 $值与一个循环?我曾尝试两种方法:

get(paste('c',i,"$values", sep="")) 

只是没有外循环,甚至工作,而本身

get(paste('c',"1", sep=""))[[1]] 

作品(返回列向量),而是试图进行操作时:

assign(get(paste("c","1", sep=""))[[1]], as.numeric(as.character(get(paste("c","1", sep=""))[[1]]))) 

返回“无效第一个参数”的错误。

任何想法?

感谢,

罗伯托

+0

我能看到的循环?如果没有它,我有点难以想象。 :/ – 2010-07-29 05:52:38

回答

1

内部的$运营商是可以明确地称为"$"用于获取和"$<-"的设定功能。 assignget相反。所以,要打破东西成不连续的步骤有:编码成一个变量名

varname<-paste("c",1,sep="") 
obj<-get(varname) 
x<-"$"(obj,"values") 
x<-as.numeric(as.character(x)) 
obj<-"$<-"(obj,"values",x) 
assign(varname,obj) 

但有数据(如索引)是不是好的做法。将c1,c2等转换为列表或数据框然后遍历它们可能是一个更好的主意。转换可以通过如下方式完成:

lapply(1:2,function(i) get(paste('c',i,sep=''))) 
+0

jmoy,谢谢。我看到硬编码选项,但我不明白关于lapply的最后一个建议。 c1,c2等是数据帧。你可以扩展这个想法吗?试图学习良好的做法。 – Roberto 2010-07-29 14:50:02

+0

c1,c2 ......形成一个序列,get(paste(...))是我们获得序列特定元素的方法。但是R已经提供了列表来表示具有标准下标操作的序列以及用于获取元素的循环。我建议你使用c1,c2 ......来转换成适当的数据帧列表,而不是将它们保持为与名称相关的隐式序列。这个乐观的例子是展示如何做到这一点。 – 2010-07-29 16:52:40

1

您也可以通过整数索引列。这在R网站的R入门指南中有解释。

+0

在最后一个例子中我没有这么做吗?它仍然不起作用。 – Roberto 2010-07-29 14:50:37

+1

不,你没有。这里: 'z < - data.frame(x = c(1,2,3),y = c(4,5,6))'然后'z [,2]'与z $ y相同 – zvrba 2010-07-29 14:58:35

+0

啊,我只是看着你的问题,而没有看到你的代码。最好的办法是把所有的数据帧放到一个列表中,比如'everything < - list(c1 = data.frame(..),c2 = data.frame(..))'现在,你可以如果你第一次“附加(所有)”,你可以像'everything $ c1'一样访问你的框架,或者将它们作为'everything [[1]]'或者只是'c1'。 再一次,所有这一切都在关于R. – zvrba 2010-07-29 15:02:44

0

与其将您的因子变量转换为数值,您可能最好找出为什么它们首先转化为因子。

然而,因为没有人给你一个体面的解决您的问题,在这里与sapply和lapply一个简单的方法:

factors <- sapply(c1, is.factor) 
c1[factors] <- lapply(c1[factors], function(x) as.numeric(as.character(x)))