23

R データ フレームの途中に列を追加するにはどうすればよいですか? 「LastName」という名前の列があるかどうかを確認し、まだ存在しない場合は 3 番目の列として追加したいと考えています。

4

6 に答える 6

23

1 つの方法は、列をデータ フレームの末尾に追加し、サブセット化を使用して目的の位置に移動することです。

d$LastName <- c("Flim", "Flom", "Flam")
bar <- d[c("x", "y", "Lastname", "fac")]
于 2009-07-26T14:08:09.920 に答える
18

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
> 
于 2009-07-24T14:28:22.267 に答える
2

Dirk Eddelbuettelの答えは機能しますが、行番号を示したり、姓の列にエントリを指定したりする必要はありません。このコードは、次の名前のデータフレームに対して実行する必要がありますdf

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

(これはデフォルトLastNameNA。ですが、同じように簡単に「LastName='Smith'」を使用できます)

于 2009-08-02T03:33:24.577 に答える
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は20列のbobという名前です。

bob2 <- data.frame(bob[,1:11],newcolumn, bob[,12:20]

最後に追加して、ハドリーからの回答を再配置するのも好きでしたが。

于 2009-07-28T05:26:44.450 に答える
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
于 2009-07-26T08:01:10.883 に答える
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)
于 2009-07-28T06:19:07.373 に答える