我试图遍历data.frame中的53行,并使用结果创建一个邻接矩阵。但是,由于循环无法正确运行,我的努力继续停滞。
我尝试创建匹配并应用许多count()
函数,但均未成功。
MRE :(实际上,数据要大得多,所以我唯一的搜索实际上是217k个元素)
df1<-data.frame(col1=c(12345,123456,1234567,12345678),
col2=c(54321,54432,12345,76543),
col3=c(11234,12234,1234567,123345),
col4=c(54321,54432,12345,76543))
search<-c(12345,1234567,75643,54432)
我想遍历每一行并更新一个新的matrix / df,其中[搜索]中每个数字的计数将作为输出。
例如:
df2
12345 1234567 75643 54432
row1 TRUE TRUE FALSE FALSE
row2 FALSE FALSE TRUE TRUE
row3 TRUE TRUE FALSE FALSE
row4 TRUE FALSE TRUE TRUE
答案 0 :(得分:1)
我认为您应该检查tf (term frequency) algorithm
进行文本挖掘。对于您的示例,这里有一个有趣的方法,使用library(quanteda)
创建带有计数的矩阵。然后,您可以根据次数进行所需的搜索:
library("tibble")
library("quanteda")
df1<-data.frame(col1=c(12345,123456,1234567,12345678),
col2=c(54321,54432,12345,76543),
col3=c(11234,12234,1234567,123345),
col4=c(54321,54432,12345,76543))
df2<-apply(df1,2,paste, collapse = " ") # Passing it to string format
DocTerm <- quanteda::dfm(df2)
DocTerm
Document-feature matrix of: 4 documents, 10 features (60.0% sparse).
4 x 10 sparse Matrix of class "dfm"
features
docs 12345 123456 1234567 12345678 54321 54432 76543 11234 12234 123345
col1 1 1 1 1 0 0 0 0 0 0
col2 1 0 0 0 1 1 1 0 0 0
col3 0 0 1 0 0 0 0 1 1 1
col4 1 0 0 0 1 1 1 0 0 0
我希望这会有所帮助!
答案 1 :(得分:1)
虽然不清楚计数的来源,甚至可能有错字(75643 != 76543
),或者如果您是按行或列运行,请考虑嵌套的sapply
和apply
两个边距的解决方案:
按行
search <- c(12345, 1234567, 76543, 54432) # ADJUSTED TYPO
mat <- sapply(search, function(s) apply(df1, 1, function(x) s %in% x)) # 1 FOR ROW MARGIN
colnames(mat) <- search
rownames(mat) <- paste0("row", seq(nrow(df1)))
mat
# 12345 1234567 76543 54432
# row1 TRUE FALSE FALSE FALSE
# row2 FALSE FALSE FALSE TRUE
# row3 TRUE TRUE FALSE FALSE
# row4 FALSE FALSE TRUE FALSE
按列
search <- c(12345, 1234567, 76543, 54432) # ADJUSTED TYPO
mat <- sapply(search, function(s) apply(df1, 2, function(x) s %in% x)) # 2 FOR COL MARGIN
colnames(mat) <- search
rownames(mat) <- paste0("col", seq(ncol(df1)))
mat
# 12345 1234567 76543 54432
# col1 TRUE TRUE FALSE FALSE
# col2 TRUE FALSE TRUE TRUE
# col3 FALSE TRUE FALSE FALSE
# col4 TRUE FALSE TRUE TRUE