【问题标题】:average number of words in a character vector in RR中字符向量中的平均单词数
【发布时间】:2014-04-16 09:48:42
【问题描述】:

我正在尝试在 R 中获取我的字符向量中的平均单词数

one <- c(9, 23, 43)
two <- c("this is a new york times article.", "short article.", "he went outside to smoke a cigarette.")

mydf <- data.frame(one, two)
mydf

#   one                                   two
# 1   9     this is a new york times article.
# 2  23                        short article.
# 3  43 he went outside to smoke a cigarette.

我正在寻找一个函数,它可以为我提供字符向量“two”的平均单词数。

这里的输出应该是 5.3333 (=(7+2+7)/3)

【问题讨论】:

    标签: r dataframe character word-count


    【解决方案1】:

    以下是 qdap 包的可能性:

    library(qdap)
    wc(mydf$two, FALSE)/nrow(mydf)
    
    ## [1] 5.333333
    

    这是矫枉过正,但你也可以这样做:

    word_stats(mydf$two)
    
    ##   all n.sent n.words n.char n.syl n.poly   wps    cps   sps psps   cpw   spw pspw n.state proDF2 n.hapax n.dis grow.rate prop.dis
    ## 1 all      3      16     68    23      3 5.333 22.667 7.667    1 4.250 1.438 .188       3      1      12     2      .750     .125
    

    wps 列是每个句子的单词。

    【讨论】:

    • 创建 word_stats 对象并将其分配给具有该类的对象后,为什么 plot.word_stats(obj) 不起作用?
    • 通用 plot 对象在类之外起作用,因此如果您更改了类或新类有自己的绘图方法,那么通用 plot 将不再起作用。无论如何,plot for word_stats 只是qheat 的包装,所以你仍然可以在上面使用qheat
    • @lawyeR 如果这不能回答问题,请使用数据和示例打开一个新问题。
    【解决方案2】:

    gregexpr()

    mean(sapply(mydf$two,function(x)length(unlist(gregexpr(" ",x)))+1))
    [1] 5.333333
    

    【讨论】:

    • mean(sapply(gregexpr(" ", mydf$two), length)+1) 是同一个概念,但更简洁一些......
    • @AnandaMahto 是的,好点,不知道我为什么不先这样做
    • 我的猜测是,如果您使用我的建议,您会获得速度提升,因为它减少了对gregexpr 的调用次数。我还建议实际的解决方案包括(1)首先修剪可能存在的任何前导和尾随空格,以及(2)使您的搜索词类似于"\\s+"
    【解决方案3】:

    我确信有一些更详细的方法可用,但您可以使用 strsplit 将空格处的字符串拆分为字符向量并计算其元素长度。

    mean(sapply(strsplit(as.character(mydf$two), "[[:space:]]+"), length))
    # [1] 5.3333
    

    【讨论】:

      【解决方案4】:

      Hadley Wickham 的 stringr 包可能为此提供了最简单的方法:

      library(stringr)
      foo<- str_split(two, " ") # split each element of your vector by the space sign
      sapply(foo,length) # just a quick test: how many words has each element?
      sum(sapply(foo,length))/length(foo) # calculate sum and divide it by the length of your original object
      [1] 5.333333
      

      【讨论】:

      • stringr 方式看起来与基本方式非常相似。唯一的区别似乎是下划线。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2020-12-03
      • 1970-01-01
      相关资源
      最近更新 更多