0

更多“感觉应该是”简单的东西,今天似乎在逃避我。提前感谢您的帮助。

在一个循环中,在一个函数中,我试图添加一个列,并根据公式命名它。

我可以绑定一列,其名称取自绑定对象:data<-cbind(data,bothdata)

我可以绑定一列并手动命名绑定的对象:data<-cbind(data,newname=bothdata)

我可以绑定一个作为方程式乘积的列并手动命名绑定对象:data<-cbind(data,newname2=bothdata-1)

或者另一种方式:data <- transform(data, newColumn = bothdata-1)

我不能做的是让名字成为公式的产物。我的实际公式派生示例名称是paste("E_wgt",rev(which(rev(Esteps) == q))-1,"%")& equation for column: baddata - q

一个更简单的:data<-cbind(data,paste("magic",100,"beans")=bothdata-1). 这失败了,因为即使在前面的示例中没问题,cbind也没有预料到。=同样失败transform

我的第一个想法是assign,虽然我已经成功地使用它来创建以论坛命名的对象,但我看不出如何让它适用于以公式命名的

如果我使用中间步骤将命名公式放入对象容器中,则使用它,例如:

name <- paste("magic",100,"beans")
data<-cbind(data,name=bothdata-1)

列名是“名称”而不是“magic100beans”。如果我assign将方程结果为一个以公式命名的对象:

assign(paste("magic",100,"beans"),bothdata-1)

然后尝试通过 cbind get

data<-cbind(data,get(paste("magic",100,"beans")))

该列称为“get(paste("magic",100,"beans"))"。嘘!有什么想法吗?我突然想到我可以cbind单独做colnames(data)[ncol(data)] <- paste("magic",100,"beans")),我想我现在会接受,但仍然有兴趣找到是否有直接的方法。

谢谢。

4

2 回答 2

2

对于您的用例来说,这可能cbind是多余的。在几乎所有情况下,您都可以使用data$newname2 <- data$bothdata - 1.

在列名是动态的情况下,您可以使用[[运算符 --来引用它data[["newcol"]] <- data$newname + 1。有关其他提示和用法,请参见?'['?'[.data.frame'

编辑:纳入@Marek 的建议,[["newcol"]]而不是[, "newcol"]

于 2015-09-01T19:37:17.807 回答
2

它可能会帮助您了解与if is "col1"data$col1相同的内容。这就是我通常以编程方式访问/设置列的方式。data[,"col1"]data[,x]x

所以这应该工作:

name <- paste("magic",100,"beans")
data[,name] <- obsdata-1

请注意,您不必使用临时变量name。这相当于:

data$magic100beans <- obsdata-1

对于 data.frame,它本身相当于:

data<-cbind(data, magic100beans=bothdata-1)

如您所知,您还可以在之后设置名称:

old_names <- names(data)
name <- paste("magic",100,"beans")

data <- cbind(data, bothdata-1)

data <- setNames(data, c(old_names, name))
# or
names(data) <- c(old_names, name)
于 2015-09-01T19:37:57.067 回答