我想知道是否有更有效的方法为数据框中的新变量赋值,而不是使用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'
非常感谢!
答案 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 ) )