如何使用lapply处理列表结构重构电话号码?
解决列表中矩阵重构电话号码的问题
你的错误主要出在**lapply的使用方式**上,还有列表中存在0行矩阵的边界情况需要处理。我们一步步来修正:
错误原因分析
你当前的lapply写法中,第二个参数直接写了str_c(...),这会导致R先尝试执行这个str_c语句,但此时phone_numbers这个变量根本不存在(你应该是想引用列表里的每个元素),而且没有针对列表中的每个矩阵元素做遍历操作,所以才会抛出"incorrect number of dimensions"的错误。
另外,你的列表里包含一个0行4列的矩阵(第二个元素),直接提取列的话会得到空字符,需要特殊处理来返回NA。
正确的解决方案
我们需要用匿名函数来接收列表中的每个矩阵元素,然后针对每个矩阵做拼接操作,同时处理空矩阵的情况:
library(stringr) # 处理列表中的每个矩阵元素 result <- lapply(phone_numbers_list, function(x) { # 先判断矩阵是否有行,处理空矩阵的情况 if (nrow(x) == 0) { return(NA_character_) } # 提取对应列并按格式拼接电话号码 str_c("(", x[,2], ")", " ", x[,3], "-", x[,4]) })
执行结果
运行上面的代码后,你会得到符合预期的结果:
[[1]] [1] "(555) 555-0191" [[2]] [1] NA [[3]] [1] "(555) 555-0191" [[4]] [1] "(555) 555-0191" "(555) 555-0192"
细节说明
- 匿名函数的作用:
function(x)中的x会依次指代phone_numbers_list里的每个矩阵,这样我们就能对每个矩阵单独操作。 - 空矩阵处理:通过
nrow(x) == 0判断矩阵是否为空,直接返回NA_character_(明确的字符型NA),避免返回空字符向量。 - 多行矩阵适配:对于像第四个元素那样的多行矩阵,
str_c会自动按行进行拼接,返回对应长度的结果向量。
如果你觉得判断行数的写法有点繁琐,也可以简化成这样(自动把空结果转为NA):
result <- lapply(phone_numbers_list, function(x) { res <- str_c("(", x[,2], ")", " ", x[,3], "-", x[,4]) if (length(res) == 0) NA_character_ else res })
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

