2013-04-11 88 views
-1

我:将字符向量转换为R中的数值向量以赋值?

z = data.frame(x1=a, x2=b, x3=c, etc) 

我试图做的事:

for (i in 1:10) 
{ 
    paste(c('N'),i,sep="") -> paste(c('z$x'),i,sep="") 
} 

问题:

  1. paste(c('z$x'),i,sep="")产量"z$x1", "z$x1",而不是调用的实际值。我需要评估表达。我试过as.numeric, eval。似乎都没有工作。

  2. paste(c('N'),i,sep="")收益率"N1", "N2"。我需要这个表达仅仅作为名字。如果我尝试给它赋值如paste(c('N'),5,sep="") -> 5,即"N5" -> 5而不是N5 -> 5,那么我将赋值的目标扩展到非语言对象。

这个任务是很简单,因为我可以简单地做:

N1 = X1 ... N2 = X2 ...

等,但我想学习新的东西

+1

使用'get'和'assign',但不这样做 - 使用列表来代替。有关于此的R常见问题解答以及许多SO问题(现在您知道正确的事情要寻找)。 – 2013-04-11 21:20:01

回答

2

我建议使用类似for(i in 1:10) z[,i] <- N[,i] ...

但是,既然你说你想学习新的东西,你可以玩弄parsesubstitute

注意:这些小工具很有趣,但有经验的用户(不是我)避免它们。

这被称为“在语言上计算”。这非常有趣,它有助于理解R的工作方式。让我试着给出一个简介:

基本的语言结构是一个常数,就像数字或字符向量一样。这是微不足道的,因为它与“未评估”版本没有区别,但它是更复杂表达式的基石之一。

(正式)基本语言对象是symbol,也被称为name。它只不过是一个指向另一个对象的指针,也就是标识另一个可能存在也可能不存在的对象的标记。例如,如果您运行的是x <- 10,则x是一个符号,指的是值10。换句话说,评估符号x会得到数字矢量10。评估不存在的符号会产生错误。

符号看起来像一个字符串,但它不是。您可以使用as.symbol("x")将字符串变成符号。

下一个语言对象是call。这是一个递归对象,实现为list,其元素是常量,符号或其他调用。第一个元素必须是而不是是一个常数,因为它必须评估为真正的function将被调用。其他元素是这个函数的参数。

如果第一个参数不计算为现有函数,则R将抛出Error: attempt to apply non-functionError: could not find function "x"(如果第一个参数是未定义的符号或指向函数以外的其他函数)。

实施例:码字行f(x, y+z, 2)将被解析为4个元素的列表,第一个是f(作为标志),第二个是x(另一符号),第三另一call和第四数字常数。第三个元素y+z只是一个带有两个参数的函数,因此它解析为三个名称的列表:'+',yz

最后,还有expression对象,即调用/符号/常量列表,这些对象将被逐个评估。

您会在这里找到大量的信息:

https://github.com/hadley/devtools/wiki/Computing-on-the-language

好了,现在让我们回到你的问题:-)

什么你都试过不行,因为paste输出是一个字符串,赋值函数将其作为第一个参数作为结果赋予符号,以创建或修改。或者,第一个参数也可以评估为与替代函数关联的呼叫。这些有点棘手,但它们是由赋值函数本身处理的,而不是由解析器处理的。

您看到的错误消息target of assignment expands to non-language object由分配函数触发,这正是因为您的目标计算结果为字符串。

我们可以解决这个问题,在正确的地方建立一个具有所需符号的呼叫。最“暴力”的方法是把所有的字符串,并使用解析里面:

parse(text=paste('N',i," -> ",'z$x',i,sep="")) 

另一种方式来获得有使用substitute

substitute(x -> y, list(x=as.symbol(paste("N",i,sep="")), y=substitute(z$w, list(w=paste("x",i,sep=""))))) 

内替代创建call小号z$x1z$x2等。外部替代品将此调用作为赋值的目标,并将符号N1,N2等作为值。

parse导致expressionsubstitutecall中。两者都可以传递给eval以获得相同的结果。

只是最后一个音符:我再说一遍,这一切的目的是作为一个说教例如,为了帮助理解语言的内部运作,但它是从良好的编程习惯使用parsesubstitute,除非有真的是别无选择。

1

我不完全确定你要完成什么。但是,这里有一个猜测:

### Create a data.frame using the alphabet 
data <- data.frame(x = 'a', y = 'b', z = 'c') 

### Create a numerical index corresponding to the letter position in the alphabet 
index <- which(tolower(letters[1:26]) == data[1, ]) 

### Use an 'lapply' to apply a function to every element in 'index'; creates a list 
val <- lapply(index, function(x) { 
    paste('N', x, sep = '') 
}) 

### Assign names to our list 
names(val) <- names(data) 

### Observe the result 
val$x 
2

A data.framenamed list。通常好的做法,地道R-ish不是有很多在全球环境中的对象,但已经与(或类似)中列出的对象和使用lapply

你可以使用list2env到multiassign的命名元素您的列表(data.frame中的列)到全球环境

DD <- data.frame(x = 1:3, y = letters[1:3], z = 3:1) 
list2env(DD, envir = parent.frame()) 
## <environment: R_GlobalEnv> 
## ta da, x, y and z now exist within the global environment 
x 
## [1] 1 2 3 
y 
## [1] a b c 
## Levels: a b c 
z 
## [1] 3 2 1