我有一个标题为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。
有谁知道如何正确地做到这一点?
由于
答案 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