首页 > 解决方案 > 使用for循环将数字转换为字符串

问题描述

例如我有下面的代码:

a <- c(1,2,3)
b <- c("4")
c <- c("5")
d <- c(a,b,c)

我想将列表 d 的所有项目转换为字符串。我使用下面的 for 循环:

for (i in d) {
i <- toString(i)
}

但是当我检查 class(a) 时,它仍然是数字。谁能告诉我该如何解决?

标签: r

解决方案


对于初学者,您的问题是您正在覆盖索引变量i,它不会像在其他语言中那样改变底层对象。这就是为什么class(a)仍然是数字的原因。

在 R 中,向量的所有元素必须是同一类型。如果不是,那么它们将按以下顺序强制执行:逻辑、整数、双精度、字符。此外,当向量的输入是其他向量c()时,会使向量变平。我们可以通过查看以下输出在您的代码中看到这一点d

d
[1] "1" "2" "3" "4" "5"

Vectors a, b, 和c已被扁平化为一个向量,并且由于bc是字符向量,因此a已被强制为字符。为了保留它们的类型,正如@Base_R_Best_R 评论的那样,您应该使用列表对象:

d <- list(a = a, b = b, c = c)

然后,您有几种方法可以完成您在 base 中需要的内容R(这并不全面):

for 循环

for (i in seq_along(d)){ 
  d[[i]] <- as.character(d[[i]])
}

应用

这将是一个更好的选择,因为它比for循环更快,并且是在 R 中的列表对象上应用函数的一种非常常见的方式。

d <- lapply(d, as.character)

最后,如果您的意图是拥有一个由五个元素组成的扁平向量,那么您不需要for循环,as.character它是向量化的,因此它将适用于您的整个向量:

as.character(c(a,b,c))
[1] "1" "2" "3" "4" "5"

as.character(a)
[1] "1" "2" "3"

但这是多余的,因为如前所述c(),隐含地将所有内容强制为字符串。


推荐阅读