r - 使用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) 时,它仍然是数字。谁能告诉我该如何解决?
解决方案
对于初学者,您的问题是您正在覆盖索引变量i
,它不会像在其他语言中那样改变底层对象。这就是为什么class(a)
仍然是数字的原因。
在 R 中,向量的所有元素必须是同一类型。如果不是,那么它们将按以下顺序强制执行:逻辑、整数、双精度、字符。此外,当向量的输入是其他向量c()
时,会使向量变平。我们可以通过查看以下输出在您的代码中看到这一点d
:
d
[1] "1" "2" "3" "4" "5"
Vectors a
, b
, 和c
已被扁平化为一个向量,并且由于b
和c
是字符向量,因此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()
,隐含地将所有内容强制为字符串。
推荐阅读
- python-3.x - “numpy.ndarray”对象没有属性“sqrt”
- javascript - res.redirect() 在打开 s3 URL 时抛出错误
- c - 在函数内部使用函数调用是一种好习惯吗?
- php - Faceboook oauth 重定向到回调而不在 php 中请求权限
- bigcommerce - 捆绑块未在 iPhone 中加载用于 bigcommerce 中的模板主题
- reactjs - onClick 方法连续多次运行 setState,否定预期目的
- javascript - powerbi 中 d3.js 的父子 json 树
- delphi - 需要 MSVCR120.DLL 但未在项目部署中显示的应用程序 - 哪个单元需要它(如果有人知道)
- python - 将线段添加到绘图图的简洁方法(使用 python/jupyter 笔记本)?
- c# - Unity、Coroutine 在 Android 上的作用不同