我问了一个问题,我收到了一个很好的答案,解决了我的问题。但是,我想修改代码(这是我之前的问题)。
finding similar strings in each row of two different data frame
我尝试再次解释问题以及我是如何处理它的
Karsten W.的回答给了我一个标准化数据(在每个元素中为每个元素分配了一些位置)如下(我没有改变它)
normalize <- function(x, delim) {
x <- gsub(")", "", x, fixed=TRUE)
x <- gsub("(", "", x, fixed=TRUE)
idx <- rep(seq_len(length(x)), times=nchar(gsub(sprintf("[^%s]",delim), "", as.character(x)))+1)
names <- unlist(strsplit(as.character(x), delim))
return(setNames(idx, names))
}
第二部分是分别在每列上应用上述功能,所以如果我需要在1000列上执行此操作,则非常耗时。相反,我在评论中做了以下内容,我尝试使用 lappy
# s1 <- normalize(df1[,1], ";")
# s2 <- normalize(df1[,2], ";")
我喜欢这个
myS <- lapply(df1, normalize,";")
我保留另一部分,因为它是
lookup <- normalize(df2[,1], ",")
然后检查两者之间,我修改了函数只保留df2的行号(我删除了(s [found] )
process <- function(s) {
lookup_try <- lookup[names(s)]
found <- which(!is.na(lookup_try))
pos <- lookup_try[names(s)[found]]
return(paste(pos, sep=""))
}
然后无论我做什么,我都无法得到输出
process(myS$sample1)
...
最后,我需要将数据放在txt文件中,或者我可以读取的内容。我使用write.table
,但这不起作用。
有没有更好的方法来做到这一点?怎么自动完成?
答案 0 :(得分:2)
这是一个错字。 process(myS$sample_1)
代替...(myS$sample1)
我明白了:
> process(myS$sample_1)
[1] "4" "1" "4"
和
> lapply(myS, process)
$sample_1
[1] "4" "1" "4"
$sample_2
[1] "4" "15" "16"
对于函数process()
的IMHO,最好返回一个整数向量:
process <- function(s) {
lookup_try <- lookup[names(s)]
found <- which(!is.na(lookup_try))
pos <- lookup_try[names(s)[found]]
names(pos) <- NULL
pos
}
将结果放在数据框中:
r <- lapply(myS, process)
m <- max(sapply(r, length))
r.matrix <- matrix(NA, m, length(r))
for (j in 1:length(r)) {
x <- r[[j]]
length(x) <- m
r.matrix[,j] <- x
}
colnames(r.matrix) <- names(r)
r.df <- as.data.frame(r.matrix)