在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
答案 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))