23

如何在 R 数据框中间添加一列?我想看看我是否有一个名为“LastName”的列,如果它不存在,则将其添加为第三列。

4

6 回答 6

23

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

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

在我编写的许多愚蠢的小辅助函数中,每次加载 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, bob[,12:20]

虽然我喜欢最后的添加并重新排列哈德利的答案。

于 2009-07-28T05:26:44.450 回答
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 回答
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 回答