R在文本中查找值

时间:2017-06-02 00:54:07

标签: r

在r中,我想找到文本列中包含在向量AA,BB和CC中的值的数量。文本列长度各不相同,内容也各不相同(注意我的r将此列作为1级的因子读取)。

#SampleCode

AA = c(540,300,330)
BB = c(400)
CC = c(530,310)

for(i=1:length(Text))
{
  if (AA in Text[i]): 
      {
     A[i] = NumberofAFound/length(AA)
      }
  else if (BB in Text[i]) {
    B[i] = NumberofBFound/length(BB)
      }
  else if (CC in Text[i]) {
    C[i] = NumberofCFound/length(CC)
     }
}

期望输出:

Day          A   B   C
01-Jan-14    1   0   0.5
02-Jan-15    0   1   0

源文件:

  Day         Text
  01-Jan-14   The number 540, 300, 330. 


              The day is 530

  02-Jan-15   The day is 400

1 个答案:

答案 0 :(得分:1)

我确定有一个更简单的解决方案,但这里有一个选项:

1)将矢量放入命名列表中。

vectorList <- list(A = AA, B = BB, C = CC)

2)编写一个函数,它接受一个数字向量,一个带有Day和Text列的数据帧,以及一个最终的列名作为字符串,然后返回一个数据帧,其中包含Day和在Text列中计算向量的次数

    check <- function(df, vector, colName) {
              z <- NULL
              for(i in unique(vector)) {
                  for(j in unique(df$Day)) {
                      one <- subset(df, Day == j)
                      x <- sapply(one$Text, function(x) grepl(as.character(i), x))
                      y <- sum(x)/length(vector)
                      z <- rbind(z, data.frame(Day = j,
                                               Value = i, 
                                               Prop = y,
                                               stringsAsFactors = FALSE))
                   }
              }
              a <- aggregate(z$Prop, 
                             by = list(Day = z$Day), 
                             FUN = sum)
              colnames(a)[2] <- colName
              a
    }

3)使用lapply在向量列表中的每个元素上运行该函数。这将返回一个数据帧列表。这使用向量的名称来命名数据帧的最后一列(例如,列&#34; A&#34;用于AA向量)。

dfList <- lapply(seq_along(vectorList), function(i) {
   colName <- paste(names(vectorList)[[i]])
   vector <- vectorList[[i]]
   check(df, vector = vector, colName = colName)
})

4)将数据帧列表缩减为单个数据帧。

output <- Reduce(merge, dfList)

希望有所帮助!

数据:

df <- data.frame(Day = c("01-Jan-14", "02-Jan-15"),
             Text = c("The number 540, 300, 330. The day is 530.", 
                      "The day is 400"))

AA <- as.vector(c(540,300,330))
BB <- as.vector(400)
CC <- as.vector(c(530,310))