簡體   English   中英

R在文本中查找值

[英]R finding values inside text

在r中,我想找到向量AA,BB和CC中包含的“文本列”中的值數。 文本列的長度各不相同,內容也各不相同(請注意,我將此列讀為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)使向量成為一個命名列表。

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在向量列表中的每個元素上運行該函數。 這將返回數據幀列表。 這使用向量的名稱來命名數據幀的最后一列(例如,AA向量的列“ A”)。

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM