R データ フレームの途中に列を追加するにはどうすればよいですか? 「LastName」という名前の列があるかどうかを確認し、まだ存在しない場合は 3 番目の列として追加したいと考えています。
6 に答える
1 つの方法は、列をデータ フレームの末尾に追加し、サブセット化を使用して目的の位置に移動することです。
d$LastName <- c("Flim", "Flom", "Flam")
bar <- d[c("x", "y", "Lastname", "fac")]
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
>
Dirk Eddelbuettelの答えは機能しますが、行番号を示したり、姓の列にエントリを指定したりする必要はありません。このコードは、次の名前のデータフレームに対して実行する必要がありますdf
。
if(!("LastName" %in% names(df))){
df <- cbind(df[1:2],LastName=NA,df[3:length(df)])
}
(これはデフォルトLastName
でNA
。ですが、同じように簡単に「LastName='Smith'
」を使用できます)
私が書いた多くのばかげた小さなヘルパー関数の中で、これは 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]
最後に追加して、ハドリーからの回答を再配置するのも好きでしたが。
または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
私はいつも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)