2009-07-24 36 views

回答

17

1)存在测试:在名称中使用%,例如%。

> 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 
> 
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 
+0

我建议你不要使用cbind作为语义是相当复杂的:根据输入你可能会得到一个矩阵或数据。框架 – hadley 2009-07-26 14:06:16

23

一种方法是将列添加到数据框的末尾,然后使用子集将其移动到所需的位置:

d$LastName <- c("Flim", "Flom", "Flam") 
bar <- d[c("x", "y", "Lastname", "fac")] 
+0

好的!没有看到那个伎俩。你也可以直接重新分配给它。 – 2009-07-26 15:42:53

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 < - data.frame(BOB [,1:11],newcolumn,鲍勃[12:20]

虽然我喜欢该加载在结束和从哈德利以及重新排列答案

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) 
2

Dirk Eddelbuettel的答案有效,但您不需要指定行号或在姓氏列中指定条目。此代码应做到名为df数据帧:

if(!("LastName" %in% names(df))){ 
    df <- cbind(df[1:2],LastName=NA,df[3:length(df)]) 
} 

(这个默认LastNameNA,但你可以很容易地使用“LastName='Smith'”)