比R中的循环更有效

时间:2014-08-06 18:30:23

标签: r for-loop

我想知道是否有更有效的方法为数据框中的新变量赋值,而不是使用for循环。我最近有两个例子:

[1]使用vwr包获得标准化的Leveshtein距离:

rst34$Levenshtein = rep(0, nrow(rst34))
for (i in 1:nrow(rst34)) {
    rst34$Levenshtein[i] = levenshtein.distance(
    as.character(rst34$target[i]), as.character(rst34$prime[i]))[[1]] /
    max(nchar(as.character(rst34$target[i])), nchar(as.character(rst34$prime[i]))
    )
}

[2]从另一个变量中提取子串:

rst34$Experiment = 'rst4'
for (i in 1:nrow(rst34)) {
    rst34$Experiment[i] = unlist(strsplit(as.character(rst34$subject[i]), '[.]'))[1]
}

另外,我认为两个例子中的初始化之间应该没有区别:

rst34$Levenshtein = rep(0, nrow(rst34))
rst34$Experiment = 'rst4'

非常感谢!

2 个答案:

答案 0 :(得分:1)

像...一样的东西。

rst34$Experiment = sapply(rst34$subject, function(element){
    unlist(strsplit(as.character(element), '[.]'))[1]
})

应该有希望做到这一点。我没有你的数据,所以我实际上无法测试它。

答案 1 :(得分:1)

将nchar应用于字符变量才有意义,因此可能不需要as.character调用:

     rst34$Levenshtein <- 
           levenshtein.distance( rst34$target, rst34$prime) /
                                            pmax(nchar(rst34$target), 
                                                 nchar(rst34$prime ) )