2009-07-24 76 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'」)