【问题标题】:R not converting to numericR不转换为数字
【发布时间】:2013-12-12 20:03:40
【问题描述】:

我有一个从制表符分隔文件导入的信息矩阵。导入这些数据后,我会将其合并到一个数据框中,并对其进行一些编辑以使其可用。

最后一步是我将所有数字转换为数字。为了做到这一点,我使用 as.numeric(as.character())。不幸的是,数字不会变成数字。它们仍然是 chr 类型。 这是我的代码:

   stringsAsFactors=F
filelist <- list.files(path="C:\\Users\\LocalAdmin\\Desktop\\Correlation Project\\test", full.names=TRUE, recursive=FALSE)
temp <- data.frame()
TSV <- data.frame()
for (i in seq (1:length(filelist)))
{
    temp <- read.table(file=filelist[i],head=TRUE,sep="\t")
    TSV <- rbind(TSV,temp)
}


for (i in seq(15,1,-1))  #getting rid of extraneous dataframe entries
{
    TSV <- TSV[-i,] #deleting by row
}

for(i in seq(1,ncol(TSV),1))
{
    TSV[,i] <- as.numeric(as.character(TSV[,i]))
} 

感谢您的帮助!

【问题讨论】:

  • 即使使用您的代码,如果没有实际数据,我们也很难知道发生了什么。 class(TSV[,1]) 的输出是什么?如果您可以发布 dput(head(TSV[,1])) 的输出,那也很有用 - 它可以让我们重新创建一小块 TSV 对象。
  • 请做一个可重现的例子并删除所有不需要的东西。另外,为什么要使用 for 循环?
  • @EDi 我会清理代码并上传另一个版本。我正在使用 for 循环遍历数据库,并删除以“b”“a”“l”或“u”开头的所有列。我这样做是因为这些列包含我不需要的信息。
  • @MattParker 生成的数据框基本上是第一列上的几个名字,其余的列只是十进制数字。这是您要求的输出: structure(c("-1.26", "-1.94", "0.5", "-1.79", "0.55", "1.45"), .Names = c("S9_Z", " S4_Y”、“H4_X”、“H_O”、“L461_L”、“H4_Z”。

标签: r type-conversion


【解决方案1】:

你可以使用

TSV <- as.data.frame(as.numeric(as.matrix(TSV)))

这只有在所有值都可以转换为数字时才有效。

【讨论】:

  • 我将编写一些代码来清理所有非数字条目,并让您知道这是否有效。谢谢!
【解决方案2】:

这里有几件事:

尽可能选择向量运算

无需在 for 循环中读取文件

TSV<-do.call(rbind,lapply(filelist, read.delim))

可以将消除无关信息的循环简化为向量操作

TSV<-TSV[-(1:15),] 

我假设你得到了你想要的因子和整数作为数字

oldClasses<-sapply(TSV[1,],class)
int2numeric<-oldClasses == "integer"
factor2numeric<-oldClasses == "factor"

TSV[,int2numeric]<-as.numeric(TSV[,int2numeric])
TSV[,factor2numeric]<-as.numeric(as.character(TSV[,factor2numeric]))

您可以将上述 2 减为 1,但我认为这让您的意图更加明确

应该就是这样

【讨论】:

  • 感谢您的帮助,代码使我的脚本更加高效。但是,TSV 的所有元素都是“chr”类型。我尝试使用 sapply(TSV,as.numeric) 转换它们,但它没有将它们转换为数字。另外,你为什么要这样做?oldClasses
  • 这是我的 TSV 数据帧:chr [1:54, 1:3] "-1.26" "-1.94" "0.50" "-1.79" "0.55" "1.45" "-3.74" " -1.85" "1.35" ... - attr(*, "dimnames")=List of 2 ..$ : chr [1:54] "S4_Y" "S42_Y" "H46_X" "H46" ... ..$ : 字符 [1:3] "862421" "862439" "862738"
  • 我不知道你所有的列在哪里,所以我想保存类,然后能够查找哪些列在哪里整数/因子并相应地转换为数字。我没有两次查找列类型,而是将其保存为变量。嗯...不将它们转换为数字是什么意思?它失败了吗?他们仍然是角色吗?是否引入了 NA?
  • 太酷了。我不知道你能做到这一点。它们都保留为字符,就好像我从未尝试过转换它们一样。虽然我找到了解决方案! PL。检查我在这个线程上的答案。谢谢!
【解决方案3】:

@JPC 我终于设法让它工作了。这是我的代码:

TSVnew<-apply(TSV,2,as.numeric)
rownames(TSVnew)<-rownames(TSV)
TSV<-TSVnew

但是,我仍然不明白为什么我之前使用它的尝试不起作用:

for(i in seq(1,ncol(TSV),1))
{
    TSV[,i] <- as.numeric(as.character(TSV[,i]))
}

【讨论】:

    猜你喜欢
    • 2021-11-05
    • 2020-04-26
    • 2013-11-15
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多