【问题标题】:create a new column in R using a user defined function使用用户定义的函数在 R 中创建一个新列
【发布时间】:2014-02-12 08:26:35
【问题描述】:

我正在尝试对列进行模式匹配,并使用用户定义的函数使用匹配模式的一部分创建一个新列。

表名是数据,它包含

MatchedColumn
24 abcd
32 gcef
45 lmno

代码是

f4<-function()
{
  data$NewColumn <- gsub('([0-9]{2}) *','\\1',data$MatchedColumn)
}

我将函数调用为 f4(),但它没有执行函数的内部部分。

但是当我单独运行以下行时,它会在匹配后创建一个新列,生成的表如图所示。

data$NewColumn <- gsub('([0-9]{2}) *','\\1',data$MatchedColumn)

数据:

MatchedColumn  NewColumn
 24 abcd         24
 32 gcef         32
 45 lmno         45

我正在尝试使用用户定义的函数,因为我想通过函数传递 NewColumnMatchedColumn 名称,例如 f4(NewColumn,MatchedColumn)

如果有人知道怎么做,请帮忙!

【问题讨论】:

  • 给函数一个参数,最好是data

标签: r pattern-matching


【解决方案1】:

有几种选择:

  • 您可以将数据作为参数传递给函数

    f4<-function(data, col1, col2)
    {
       data[,col1] <- sapply(data[col2], function(x)gsub("[^0-9]", "", x))
       return(data)
    }
    
    newdata <- f4(data, 'NewColumn', 'MatchedColumn')
    str(newdata)
    
  • 您可以使用&lt;&lt;- 进行全局分配

    f4<-function(col1, col2)
    {
      data[col1] <<- sapply(data[col2], function(x)gsub("[^0-9]", "", x))
    }
    
    f4('NewColumn', 'MatchedColumn')
    

我肯定更喜欢第一个选项

【讨论】:

  • Thnx 第一种方法工作正常,但在第二种方法中传递 NewColumn 和 MatchedColumn 不起作用,那么该怎么做呢?
  • 我已经编辑了我的答案以允许设置列的名称 - 我仍然认为选项 1 更可取,因为你不能弄乱你的全局变量
  • 请注意我们得到的是 MatchedColumn NewColumn 24 abcd c(24,32,45) 32 gcef c(24,32,45) 45 lmno c(24,32,45)
猜你喜欢
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多