[英]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.