将字符串转换为R中的变量

Posted

技术标签:

【中文标题】将字符串转换为R中的变量【英文标题】:Convert string to variable in R 【发布时间】:2015-08-13 07:41:00 【问题描述】:

我正在尝试将数据从文本文件读入 R 以便我可以绘制它:

coupling <- read.table("~/table.format",stringsAsFactors = FALSE, sep='\t')

该表中的一行如下所示:

133 0.0116, 0.0226, 0.0236, 0.0244, 0.0264, 0.0124, 0.013, 0.014, 0.0158, 0.034, 0.0348, 0.0356, 0.0372  329777.0, -236464.0, -348470.0, -554708.0, -471896.0, 538782.0, 695291.0, 812729.0, 983141.0, 208212.0, 214012.0, 366636.0, 343232.0

列(残差、延迟、高度)由制表符分隔,列中的数据由“,”分隔。我现在想绘制高度与延迟,所以我尝试将列分配给变量:

 xdata <- c(coupling[1,2])
 ydata <- c(coupling[1,3])

但是,如果我尝试绘制 plot(xdata,ydata) 我会收到以下错误:

Error in plot.window(...) : need finite 'xlim' values
In addition: Warning messages:
1: In xy.coords(x, y, xlabel, ylabel, log) : NAs introduced by coercion
2: In xy.coords(x, y, xlabel, ylabel, log) : NAs introduced by coercion
3: In min(x) : no non-missing arguments to min; returning Inf
4: In max(x) : no non-missing arguments to max; returning -Inf
5: In min(x) : no non-missing arguments to min; returning Inf
6: In max(x) : no non-missing arguments to max; returning -Inf

打印 xdata(和 ydata)会给出形式如下的变量:

xdata
[1] "0.0116, 0.0226, 0.0236, 0.0244, 0.0264, 0.0124, 0.013, 0.014, 0.0158, 0.034, 0.0348, 0.0356, 0.0372 "

大概 R 不能用引号来绘制这个。我已经尝试了一些替代方案来尝试解决这个问题,但是,这些都没有奏效:

newxdata <-as.numeric(xdata)

返回错误:

    Warning message:
    NAs introduced by coercion

打印让我接近:

print(xdata,quote=FALSE)

这似乎可以解决问题;输出丢失引号:

[1] 0.0116, 0.0226, 0.0236, 0.0244, 0.0264, 0.0124, 0.013, 0.014, 0.0158, 0.034, 0.0348, 0.0356, 0.0372 

但是如果我将它分配给一个变量,引号会重新出现,我仍然无法绘制数据:

newxdata <- c(print(xdata,quote=FALSE))
 newxdata
[1] "0.0116, 0.0226, 0.0236, 0.0244, 0.0264, 0.0124, 0.013, 0.014, 0.0158, 0.034, 0.0348, 0.0356, 0.0372 "

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您也可以使用scan(数据来自@LyzanderR 的帖子)

 scan(text=a, what=numeric(), sep=",", quiet=TRUE)
 #[1] 0.0116 0.0226 0.0236 0.0244 0.0264 0.0124 0.0130 0.0140 0.0158 0.0340
 #[11] 0.0348 0.0356 0.0372

您可以直接使用scan从带有sep=","的文件中读取它

 scan("~/table.format", what=numeric(), sep=",", quiet=TRUE) #not tested

【讨论】:

【参考方案2】:

您需要先进行一些修改,然后它才会起作用。引号的原因是您有一个长度为 1 的字符向量,您需要将其转换为长度为 13 的数字向量:

#initial data set: character vector of length 1
a <- "0.0116, 0.0226, 0.0236, 0.0244, 0.0264, 0.0124, 0.013, 0.014, 0.0158, 0.034, 0.0348, 0.0356, 0.0372 "

#function to trim leading and trailing spaces **see bottom of answer
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

#first use strsplit to split the long string into separate string elements
#that are comma separated.
#Then use trim on each element to remove leading and trailing spaces
b <- trim(strsplit(a, ',')[[1]])

#finally use as.numeric to convert to numbers
c <- as.numeric(b)

现在可以在绘图中使用变量 c

输出:

> c
 [1] 0.0116 0.0226 0.0236 0.0244 0.0264 0.0124 0.0130 0.0140 0.0158 0.0340 0.0348 0.0356 0.0372

函数trim取自here

编辑

显然根据@zero323 的评论,您甚至不需要修剪字符向量。因此,这在一次调用中就可以正常工作:

> as.numeric(strsplit(a, ',')[[1]])
 [1] 0.0116 0.0226 0.0236 0.0244 0.0264 0.0124 0.0130 0.0140 0.0158 0.0340 0.0348 0.0356 0.0372

【讨论】:

您不需要trim - as.numeric 可以处理带有前导或尾随空格的字符。 @zero323 非常感谢您的评论。你是绝对正确的。我已经更新了我的答案。 @akrun 谢谢阿克伦。这是一个很好的答案。我认为它应该是一个单独的答案:)

以上是关于将字符串转换为R中的变量的主要内容,如果未能解决你的问题,请参考以下文章

在R中将完整年龄从字符转换为数字

R语言 - 字符串与变量的转换

请解释我们如何将因子变量转换为 R 中的数字

是否有将分类变量转换为连续变量的 R 函数?

在R中,如何将字符(等级)转换为数字并放在单独的列中

r 将字符串列表转换为R中的数字