【问题标题】:pass vectors to function in R将向量传递给R中的函数
【发布时间】:2016-02-23 10:01:26
【问题描述】:

我有一个 POS 标签向量。 我想创建一个 POS 标签的全局二元向量。 我在 R 中创建了以下函数:

createbi<-function(a) {
  for(i in 1:(length(a)-1)){
    bigramlist<-c(bigramlist,(paste(a[i], a[i+1], sep=" ")))
  }
}

这里我想传递一个标签列表:

> a$POStags
 [1] "DT"  "VBZ" "DT"  "JJ"  "NN"  "VBG" "IN"  "DT"  "NNS" ","   "NNS" ","   "CC"  "NNS" "." 

但我没有在 bigramlist 中得到二元组。我认为问题在于参数传递。 我想输出为:

> bigramlist
 [1] "DT VBZ" "VBZ DT" "DT JJ"  "JJ NN"  "NN VBG" "VBG IN" "IN DT"  "DT NNS" "NNS ,"  ", NNS"  "NNS ,"  ", CC"   "CC NNS"
[14] "NNS .

有人可以帮我解决这个问题吗?我是 R 新手

【问题讨论】:

    标签: r parameter-passing


    【解决方案1】:

    以下是解决您问题的三种不同方法,从最可取到最不优选(在我看来):

    a) 带头/尾粘贴

    x 表示您的向量a$POStags 的情况下,另一种可能更R-ish 的方法是直接在x 的两个子集上使用paste

    paste(head(x, -1), tail(x, -1))
    #[1] "DT VBZ" "VBZ DT" "DT JJ"  "JJ NN"  "NN VBG" "VBG IN" "IN DT"  "DT NNS" "NNS ,"  ", NNS"  "NNS ," 
    #[12] ", CC"   "CC NNS" "NNS ." 
    

    当然你也可以把它放在一个函数中:

    createbi <- function(a) paste(head(a, -1), tail(a, -1))
    

    b) 应用

    或者,您可以使用sapply 循环,如下所示(但我更喜欢第一种方法):

    createbi2 <- function(a) sapply(1:(length(a)-1), function(i) paste(a[i], a[i+1]))
    

    c) for 循环

    如果你坚持使用 for 循环,我会这样做(注意 bigramlist 的预分配):

    createbi <- function(a) {
      n <- length(a)-1
      bigramlist <- character(n)
      for(i in 1:n){
        bigramlist[i] <- paste(a[i], a[i+1])
      }
      bigramlist
    }
    

    但是您现在已经看到 a) 方法比编写 for 循环要简单得多。

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2011-02-26
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多