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$col1
与 data[,"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)
更多 '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
:
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$col1
与 data[,"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)