【问题标题】:R: calculate occurence of words from a list in data frameR:从数据框中的列表中计算单词的出现
【发布时间】:2015-12-24 18:34:57
【问题描述】:

我有一个带有Categorypd 的数据框。我需要计算每个pd 中每个有意义的单词在每个Category 中出现的次数。我坚持最后一步 - 总结。理想情况下,该频率与pd 的总长度之比Category 将是另一个X 列。

例子:

freq = structure(list(Category = c("C1", "C2"
), pd = c("96 oz, epsom salt 96 oz, epsom bath salt", 
          "17 x 24 in, bath mat")), .Names = c("Category", "pd"), row.names = c(NA, 
                                                                                -2L), class = "data.frame")

pool = sort(unique(gsub("[[:punct:]]|[0-9]","", unlist(strsplit(freq[,2]," ")))))
pool = pool[nchar(pool)>1]

freq

    Category    pd
1   C1  96 oz, epsom salt 96 oz, epsom bath salt
2   C2  17 x 24 in, bath mat

pool:

[1] "bath"  "epsom" "in"    "mat"   "oz"    "salt" 

期望的输出:

pool C1freq C1ratio C2freq C2ratio
bath 1 1/7 1 1/3
epsom 2 2/7 0 0
in 0 0 1 1/3
mat 0 0 1 1/3
oz 2 2/7 0 0
salt 2 2/7 0 0

在哪里,例如7C1[,2] 的长度,去掉了数字,标点符号(如 pool 规则)。 1/7 在这种形式中当然不是必须的 - 这里只是为了显示分母长度。

如果可能,不要使用 dplyrqdap。谢谢!!

【问题讨论】:

    标签: r aggregate plyr


    【解决方案1】:

    我们可以试试

    library(qdapTools)
    library(stringr)
    lst <- str_extract_all(freq$pd, '[A-Za-z]{2,}')
    m1 <- t(mtabulate(lst))
    m2 <-  prop.table(m1,2)
    cbind(m1, m2)[,c(1,3,2,4)]
    

    或者没有qdapTools

     Un1 <- sort(unique(unlist(lst)))
     m1 <- do.call(cbind, lapply(lst, function(x)
                table(factor(x, levels=Un1))))
     colnames(m1) <- freq$Category
     cbind(m1, `colnames<-`(prop.table(m1,2), paste0(colnames(m1), 'Prop')))
    

    【讨论】:

    • 谢谢@akrun。是否可以以简单的方式保留原始freq 的名称而不是通用的V1
    • @AlexeyFerapontov 添加了列名
    【解决方案2】:

    您可以考虑通过以下方式调整您当前的方法:

    tab <- table(
      stack(
        setNames(
          lapply(strsplit(gsub("[[:punct:]]|[0-9]", "", freq$pd), "\\s+"), 
                 function(x) x[nchar(x) > 1]), freq$Category)))
    

    注意这里我先使用gsub,而不是在拆分之后。然后,我在一个空格上拆分,并以与您过滤数据相同的方式过滤数据。最后,我使用了setNames,这样我就可以使用stack 得到一个很长的data.frame,可以制成表格。

    数据制成表格后,只需使用prop.table 即可获得所需的输出。

    cbind(tab, prop.table(tab, 2))
    #       C1 C2        C1        C2
    # bath   1  1 0.1428571 0.3333333
    # epsom  2  0 0.2857143 0.0000000
    # in     0  1 0.0000000 0.3333333
    # mat    0  1 0.0000000 0.3333333
    # oz     2  0 0.2857143 0.0000000
    # salt   2  0 0.2857143 0.0000000
    

    【讨论】:

    • 谢谢!不知道我做错了什么,但我没有得到分数
    • @AlexeyFerapontov,您应该能够直接从您的示例数据中运行它。你最后做了cbind这一步吗?
    • 我做到了。我得到 5 列:2 和 4、3 和 5 是相同的并且是计数。在您的示例中,3 和 5 是分数。是否复制/粘贴
    • @AlexeyFerapontov,你的工作环境可能有什么干扰?请参阅 here 以使用此示例数据进行验证。
    • 不确定。我打开了新的会话。还是一样
    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2014-08-24
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多