1

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

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

生成的数据帧已替换所有 A,但有 NA 而不是 1。

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

谢谢

4

2 回答 2

1

解决方案:

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

使用sapply

sapply(gen1,as.integer)

colwiseplyr

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

例如,我首先生成 A、B、C 和 D 的 data.frame:

 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
于 2013-07-21T22:58:12.053 回答
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
于 2015-10-12T14:44:43.743 回答