我编写了两个函数来翻译名称(例如“哈灵顿”)转换为相应的电话号码(“4277464866”)。一个函数get_number()
接受单个字符并返回其对应的数字(“h”至“4”),而translate_name_to_number()
获取 Dataframe 列并返回等效的电话号码(“哈灵顿”to“4277464866”)当我把print()
放入translate_name_to_number()
函数时,它会打印出一串不同的、正确的字符串,具体来说,这个函数使用了几个for循环来遍历行,然后遍历行中的每个字符:
translate_name_to_number <- function(the_column) {
for (the_string in the_column) { # iterate once per row
name_vector <- strsplit(the_string, "")[[1]] # split into a vector to iterate over it
built_phone_number <- "" # initialize a string to hold the built number
for (a_letter in name_vector) { # for each letter in the name vector...
built_phone_number <- str_c(built_phone_number, get_number(a_letter)) # ...add its number
}
print(built_phone_number) # print the concatenated result
# return(built_phone_number) #...but this only returns one value
}
}
当print语句处于活动状态时,我得到了一个很好的结果,如下所示:
[1] "7424273766"
[1] "4277464866"
[1] "6668466379"
[1] "9455426766"
[1] "8455277325"
[1] "7424273766"
[1] "7366464866"
[1] "4277464866"
这是一个很好的输出,也是我想放在新列中的内容。因此,我使用 Dataframe 并尝试使用管道和dplyr::mutate()
应用translate_name_to_number()
函数。然而,当我这样做时,我得到了一个新列,其行只包含最终名称的值,而不是每行的唯一值。
我显然漏掉了一个概念。有人能说明问题所在吗?
2条答案
按热度按时间f0brbegy1#
这是因为您的函数没有矢量化。
如果 Dataframe
df
列为name
,则可以使用rowwise()
:也正如@r2evans在评论中指出的,函数应该重写为:
x一个一个一个一个x一个一个二个x
txu3uszq2#
Return只返回最后一个值,你不能在一个循环中多次从函数返回。
我建议将您的值添加到列表中并返回该列表。