R:将列添加到数据框,根据公式命名

R: add column to dataframe, named based on formula

更多 'feels like it should be' 简单的东西,今天我似乎无法理解。在此先感谢您的帮助。

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

我可以绑定一个列,它的名字取自绑定的对象: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,"%") & 列的方程式:baddata - q.

更简单的一个:data<-cbind(data,paste("magic",100,"beans")=bothdata-1)。这失败了,因为 cbind 不期望 = 即使在前面的示例中它很好。 transform.

同样失败

我的第一个想法是 assign 但是虽然我已经成功地使用它来创建以 forumla 命名的对象,但我看不出如何让它为以公式命名的 列工作.

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

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

列名称是 "name" 而不是 "magic100beans"。如果我 assign 方程结果为公式命名的对象:

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

然后尝试通过 get:

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

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

谢谢。

很可能 cbind 对您的用例来说太过分了。在几乎所有情况下,您都可以使用 data$newname2 <- data$bothdata - 1.

简单地改变底层数据框

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

编辑:合并了@Marek 对 [["newcol"]] 而不是 [, "newcol"]

的建议

如果 x 是 "col1",data$col1data[,"col1"] 相同,data[,"col1"]data[,x] 相同,这可能会对您有所帮助。这就是我通常以编程方式 access/set 列的方式。

所以这应该有效:

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)