我想将包机序列转换为数字序列。
我的变量叫做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
} }
但它没有用。
安德烈
答案 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“)