将1个字符的字符串转换为数字值

时间:2016-04-28 15:57:16

标签: r

我想将包机序列转换为数字序列。

我的变量叫做labCancer,它是这样的:

labCancer

[1] M M M M M M M M M M M M M M M M M M M B B B M M M M M M M M M M M M M M M B

我想:

[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0

我尝试使用

labCancer_2 <- labCancer 

for (i in 1:569)    {
  if (labCancer[i] == "M") {
    labCancer_2[i] <- 1
  } else {

 labCancer_2[i] <- 2

 } }    

但它没有用。

安德烈

4 个答案:

答案 0 :(得分:1)

我能想到的唯一原因是导致循环不起作用是无法初始化labCancer_2。所以你想在开始循环之前这样做:

labCancer_2 <- numeric(length(labCancer))

如果要在循环中按元素分配对象元素,则需要先初始化该对象,否则需要以某种方式存在。

然而,有一种更好的方法可以做到这一点,不需要初始化,这将是许多人认为你应该在R

中做的方式。
labCancer_2 <- ifelse(labCancer == "M", 1, 0)

这利用了R的矢量化。

答案 1 :(得分:0)

一种解决方案是将矢量转换为因子,然后转换为整数。这将导致原始向量的所有唯一值得到一个单独的整数:

> x <- c("m", "b", "m", "b")
> x
[1] "m" "b" "m" "b"
> as.factor(x)
[1] m b m b
Levels: b m
> as.integer(as.factor(x))
[1] 2 1 2 1
> c(0, 1)[as.numeric(as.factor(x))]
[1] 1 0 1 0

使用最后一行中的技巧,可以轻松地将数字更改为匹配0和1.

答案 2 :(得分:0)

根据您使用数据的内容,只要您只有两个值,就可以执行此操作:

labCancer_2 <- ifelse(lab_cancer=="M", 1, 0)

如果您有多个值,或者想要保留字母以供参考或绘图,则可以将矢量设为一个因子:

labCancer_2 <-factor(lab_cancer, levels=c("B", "M"))

但是,因子从1开始,所以你的矢量就是 2 2 2 2 ... 1 1 1 ...
而不是 1 1 1 1 ... 0 0 0 ...

答案 3 :(得分:0)

创建一个数字矢量(0,1,0,0,1,1),将其更改为字符矢量(“ 0”,“ 1”,“ 0”,“ 0”,“ 1”,“ 1“)