如何在R数据框的中间添加列?我想看看我是否有一个名为“LastName”的列,然后将其添加为第三列(如果它尚不存在)。
答案 0 :(得分:23)
一种方法是将列添加到数据框的末尾,然后使用子集将其移动到所需位置:
d$LastName <- c("Flim", "Flom", "Flam")
bar <- d[c("x", "y", "Lastname", "fac")]
答案 1 :(得分:17)
1)测试存在:在组合名中使用%in%,例如
> example(data.frame) # to get 'd'
> "fac" %in% colnames(d)
[1] TRUE
> "bar" %in% colnames(d)
[1] FALSE
2)你基本上必须从旧的前半部分,新的列和下半部分创建一个新的data.frame:
> bar <- data.frame(d[1:3,1:2], LastName=c("Flim", "Flom", "Flam"), fac=d[1:3,3])
> bar
x y LastName fac
1 1 1 Flim C
2 1 2 Flom A
3 1 3 Flam A
>
答案 2 :(得分:2)
在我编写的许多愚蠢的小助手函数中,每次加载R时都会使用它。它只是列出了列名和索引,但我经常使用它。
##creates an object from a data.frame listing the column names and location
namesind=function(df){
temp1=names(df)
temp2=seq(1,length(temp1))
temp3=data.frame(temp1,temp2)
names(temp3)=c("VAR","COL")
return(temp3)
rm(temp1,temp2,temp3)
}
ni <- namesind
使用ni查看列号。 (ni只是namesind的别名,我从不使用namesind,但认为它最初是一个更好的名称)然后,如果你想插入你的列,位置12,你的data.frame被命名为bob 20列,它将是
bob2&lt; - data.frame(bob [,1:11],newcolumn,bob [,12:20]
虽然我最喜欢添加,但也重新安排了Hadley的答案。
答案 3 :(得分:2)
Dirk Eddelbuettel的答案有效,但您无需在lastname列中指明行号或指定条目。此代码应对名为df
的数据框执行此操作:
if(!("LastName" %in% names(df))){
df <- cbind(df[1:2],LastName=NA,df[3:length(df)])
}
(默认LastName
为NA
,但您可以轻松使用“LastName='Smith'
”)
答案 4 :(得分:1)
或使用cbind:
> example(data.frame) # to get 'd'
> bar <- cbind(d[1:3,1:2],LastName=c("Flim", "Flom", "Flam"),fac=d[1:3,3])
> bar
x y LastName fac
1 1 1 Flim A
2 1 2 Flom B
3 1 3 Flam B
答案 5 :(得分:1)
我一直认为像append()[虽然名字不幸]应该是一个通用函数
## redefine append() as generic function
append.default <- append
append <- `body<-`(args(append),value=quote(UseMethod("append")))
append.data.frame <- function(x,values,after=length(x))
`row.names<-`(data.frame(append.default(x,values,after)),
row.names(x))
## apply the function
d <- (if( !"LastName" %in% names(d) )
append(d,values=list(LastName=c("Flim","Flom","Flam")),after=2) else d)