R:as.numeric数据框弄乱了值的顺序

时间:2015-07-20 01:58:44

标签: r

我粘贴了下面代码的重要部分。基本上我正在创建一个data.frame,其中两列包含数值,一列包含因子。

我正在尝试转换"位置"列到数值,但是一旦我这样做,位置值由于某种原因切换。

f <- fread("ABC.txt",header=F,skip=1)$V1
f <- paste(f, collapse = "")

vector <- 1:stri_length(f)

fillmatrix <- c(rbind(strsplit(f, "")[[1]], vector))
A <- data.frame(1,matrix(fillmatrix, ncol=2, byrow = TRUE))
A <- A[c(1,3,2)]
colnames(A)=c("Track","Location","Base")

class(A$Track)
# [1] "factor"

A[1:15,]    # Before as.numeric
    Track Location Base
# 1     1        1    A
# 2     1        2    C
# 3     1        3    G
# 4     1        4    G
# 5     1        5    A
# 6     1        6    A
# 7     1        7    T
# 8     1        8    A
# 9     1        9    A
# 10    1       10    A
# 11    1       11    A
# 12    1       12    T
# 13    1       13    T
# 14    1       14    C
# 15    1       15    C

a <- transform(A, Location = as.numeric(Location), Track = as.numeric(Track))

a[1:15,]     # After as.numeric
#   Track Location Base
# 1     1        1    A
# 2     1      112    C
# 3     1      223    G
# 4     1      334    G
# 5     1      445    A
# 6     1      556    A
# 7     1      667    T
# 8     1      679    A
# 9     1      690    A
# 10    1        2    A
# 11    1       13    A
# 12    1       24    T
# 13    1       35    T
# 14    1       46    C
# 15    1       57    C

A数据帧相当长~700行长。我是否正在创建data.frame这个问题?还是我忽略了一个小错误?

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

可重现的例子很好。

我怀疑是因为class(A$Location)是一个因素,而不是一个角色。 在这种情况下,您需要as.numeric(as.character(Location))来获取所需的数字。这是因为R在执行a(字符串,而非数字 - 因此10在2之前)排序之后将因子编码为整数1:nlevels(your.factor)

您可以在stringsAsFactors=F来电中设置data.frame - 在fillmatrix <- ...行,您似乎正在通过strsplit on“将所有内容转换为字符(为什么会这样做)您将f粘贴在一起只是为了将其再次拆分?)