一个向数据框中添加新列的函数。

4
我需要一个函数,向数据框df中添加一个新列(具有常量值)。到目前为止,我的尝试是这样的:df
f = function(df, col.name, col.value){
  df$col.name = col.value
  print(df)
 }

一个典型的输入应该如下:

f(df, "New column", NA)

这将为我创建一个新的列,其值为NA,但该列的名称将为col.name。非常感谢任何帮助。

3
这个函数应该返回你的数据框,还是在父环境中修改它?另外,我认为它应该在你提供已存在的列名时发出警告。 - Theodore Lytras
我还没有开始使用环境,因为我刚开始学习R,所以我猜我只是在寻找返回数据框的函数。 - user32259
你选择了错误的答案。"$<-"函数已经内置于R中。它被翻译成[[<-的一个版本。不理解语言的这个方面是新手挫败的主要原因之一。你可能还想看看within函数。 - IRTFM
你有没有关于“这个语言方面”的学习建议?谢谢。 - user32259
3个回答

10

R内置了这种类型的函数,即$<-用于分配单个数据列。

> test <- data.frame(a=1:3,b=4:6)

> test
  a b
1 1 4
2 2 5
3 3 6

> `$<-`(test,"new_column",NA)
  a b new_column
1 1 4         NA
2 2 5         NA
3 3 6         NA

正如@MatthewLundberg在下面的评论中所说,如果您想避免奇怪的函数名称,您可以将此分配给您的新函数:

> f <- `$<-`
> f(test,"new_column",NA)
  a b new_column
1 1 4         NA
2 2 5         NA
3 3 6         NA

我现在只是在玩。但是似乎 $<- 就像 R 基础包中的 transform。我错了吗? - jazzurro
@jazzurro - 它的功能类似于 transform。它直接类比于复制数据框,添加一列,然后返回该副本。"$<-"(test,"new_column",NA)test$new_column <- NA 的翻译。 - thelatemail
@thelatemail 我明白了。那么,什么情况下 $<- 会更加出色?我们是否有任何需要使用该函数的情况? - jazzurro
@jazzurro,在编写特定的速记脚本时,有时候将整个对象返回非常方便,就像这个问题链接中的class<-版本一样。 - thelatemail
@thelatemail 懂了,很有道理。我今天会尝试使用这个函数和一些虚拟数据框。感谢您的教导,我今天从您那里学到了两件重要的事情。 - jazzurro

3
f = function(df, col.name, col.value){
  df[[col.name]] <- col.value
  print(df)
 }

如果您想采纳@flodel和@theodore的意见,您可以使用类似以下的方法:
f <- function(df, col.name, col.value, overwrite = FALSE){

    if ( col.name %in colnames(df) ) {
        if ( overwrite ) {
            warning(paste("column", col.name, "overwritten!"))
        } else {
            stop(paste("column", col.name, "already exists!"))
        }
    }

    df[[col.name]] <- col.value 
    return(df)
}

谢谢。顺便问一下,你知道为什么我的尝试没有成功吗? - user32259
2
正如所指出的,最好只返回 df。如果使用 print(df),函数仍将返回 df,因此您可以对其进行分配,但无论如何,新的数据框都将被打印出来,即使您对其进行了分配。大多数人都会认为这不是一个理想的特性。相反,如果函数只返回 df,则如果您正在从交互式会话的命令行运行并且输出未分配给任何内容,则仍将打印新的数据框。 - flodel
@user32259,你的尝试失败了,因为使用$进行索引无法(轻松地)使用变量内容作为索引。 - Matthew Lundberg

0
如果您知道新列的名称,可以这样做:
test <- data.frame(a=1:3,b=4:6)
test$c = c(1:3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接