替换R中的值 - 收到错误

时间:2013-07-21 22:04:43

标签: r replace

我有一个标题为gen的数据帧,这是一个由A,C,G,T和0组成的数据帧。我想将A替换为1,将C替换为2,将G替换为3,将T替换为4.当我尝试使用代码gen1[gen1 == "A"] = 1时,我收到错误消息:

Warning messages:
1: In `[<-.factor`(`*tmp*`, thisvar, value = "1") :
  invalid factor level, NAs generated

结果数据框已经替换了所有的A,但是有NA而不是1。

有谁知道如何正确地做到这一点?

由于

2 个答案:

答案 0 :(得分:1)

溶液:

您可以使用as.integer强制将列因子强制转换为整数:

使用sapply

sapply(gen1,as.integer)
来自colwise

plyr

library(plyr)
colwise(as.integer)(gen1)

例如,我首先生成A,B,C和D的数据框:

 set.seed(1)
gen1 <- as.data.frame(matrix(sample(LETTERS[1:4], 4 * 5, rep = TRUE), ncol = 4))
##   V1 V2 V3 V4
## 1  B  D  A  B
## 2  B  D  A  C
## 3  C  C  C  D
## 4  D  C  B  B
## 5  A  A  D  D
library(plyr)
colwise(as.integer)(gen1)
##   V1 V2 V3 V4
## 1  2  3  1  1
## 2  2  3  1  2
## 3  3  2  3  3
## 4  4  2  2  1
## 5  1  1  4  3
sapply(gen1, as.integer)
##      V1 V2 V3 V4
## [1,]  2  3  1  1
## [2,]  2  3  1  2
## [3,]  3  2  3  3
## [4,]  4  2  2  1
## [5,]  1  1  4  3

为什么会收到警告?

警告消息是明确的,invalid factor level, NAs generated

您收到错误是因为您尝试使用不属于级别设置的值修改因子值,因此它将替换为NA。我将重现错误:

h <- data.frame(xx = factor(c("A","B")) )
h[h == "A"] <- "C"   ## C don't belong to levels of xx 
Warning message:
In `[<-.factor`(`*tmp*`, thisvar, value = "C") :
  invalid factor level, NA generated

答案 1 :(得分:0)

您可以通过在创建数据框时设置参数stringAsFactors = False来执行此操作。默认情况下是真的。

示例代码:

d <- data.frame(a=c('A','C','G','T','0'),b=c('C','A','G','A','0'), stringsAsFactors = FALSE)
> d
  a b
1 A C
2 C A
3 G G
4 T A
5 0 0
> d[d=='A']<- '1'
> d
  a b
1 1 C
2 C 1
3 G G
4 T 1
5 0 0