如何在数据的每一列上应用函数?

时间:2016-02-27 09:41:56

标签: r

我问了一个问题,我收到了一个很好的答案,解决了我的问题。但是,我想修改代码(这是我之前的问题)。

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,但这不起作用。 有没有更好的方法来做到这一点?怎么自动完成?

1 个答案:

答案 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)
相关问题