Ann*_*nna 4 integer r text-files dataframe r-factor
我有以下代码
anna.table<-data.frame (anna1,anna2)
write.table<-(anna.table, file="anna.file.txt",sep='\t', quote=FALSE)
Run Code Online (Sandbox Code Playgroud)
我的表格最后包含如下数字
chr start end score
chr2 41237927 41238801 151
chr1 36976262 36977889 226
chr8 83023623 83025129 185
Run Code Online (Sandbox Code Playgroud)
等等......
之后,我试图只获得符合某些标准的值,例如得分小于特定值
所以我正在做以下事情
anna3<-"data/anna/anna.file.txt"
anna.total<-read.table(anna3,header=TRUE)
significant.anna<-subset(anna.total,score <=0.001)
Error: In Ops.factor(score, 0.001) <= not meaningful for factors
Run Code Online (Sandbox Code Playgroud)
所以我想问题是我的表有因素而不是整数
我想我的anna.total $得分是一个因素,我必须使它成为一个整数
如果我正确读取as.numeric可能会解决我的问题
我正在阅读as.numeric函数,但我无法理解我如何使用它
你能不能给我一些建议?
先感谢您
最好的问候安娜
PS:我尝试了以下内容
anna3<-"data/anna/anna.file.txt"
anna.total<-read.table(anna3,header=TRUE)
anna.total$score.new<-as.numeric (as.character(anna.total$score))
write.table(anna.total,file="peak.list.numeric.v3.txt",append = FALSE ,quote = FALSE,col.names =TRUE,row.names=FALSE, sep="\t")
anna.peaks<-subset(anna.total,fdr.new <=0.001)
Warning messages:
1: In Ops.factor(score, 0.001) : <= not meaningful for factors
Run Code Online (Sandbox Code Playgroud)
我又有同样的问题......
Rei*_*son 11
有了anna.table(顺便说一下,这是一个数据框,表是其他东西!),最简单的方法就是:
anna.table2 <- data.matrix(anna.table)
Run Code Online (Sandbox Code Playgroud)
如data.matrix()将转换的因素对它们的基础数值(整数)的水平.这适用于仅包含可以强制转换为数字的数字,整数,因子或其他变量的数据框,但任何字符串(字符)都将使矩阵成为字符矩阵.
如果你想anna.table2成为一个数据框而不是矩阵,那么你可以随后做:
anna.table2 <- data.frame(anna.table2)
Run Code Online (Sandbox Code Playgroud)
其他选项是将所有因子变量强制转换为整数级别.这是一个例子:
## dummy data
set.seed(1)
dat <- data.frame(a = factor(sample(letters[1:3], 10, replace = TRUE)),
b = runif(10))
## sapply over `dat`, converting factor to numeric
dat2 <- sapply(dat, function(x) if(is.factor(x)) {
as.numeric(x)
} else {
x
})
dat2 <- data.frame(dat2) ## convert to a data frame
Run Code Online (Sandbox Code Playgroud)
这使:
> str(dat)
'data.frame': 10 obs. of 2 variables:
$ a: Factor w/ 3 levels "a","b","c": 1 2 2 3 1 3 3 2 2 1
$ b: num 0.206 0.177 0.687 0.384 0.77 ...
> str(dat2)
'data.frame': 10 obs. of 2 variables:
$ a: num 1 2 2 3 1 3 3 2 2 1
$ b: num 0.206 0.177 0.687 0.384 0.77 ...
Run Code Online (Sandbox Code Playgroud)
但请注意,只有在需要基础数字表示时,上述操作才有效.如果你的因子基本上是数字水平,那么我们需要更加清楚地将因子转换为数字,同时保留在关卡中编码的"数字"信息.这是一个例子:
## dummy data
set.seed(1)
dat3 <- data.frame(a = factor(sample(1:3, 10, replace = TRUE), levels = 3:1),
b = runif(10))
## sapply over `dat3`, converting factor to numeric
dat4 <- sapply(dat3, function(x) if(is.factor(x)) {
as.numeric(as.character(x))
} else {
x
})
dat4 <- data.frame(dat4) ## convert to a data frame
Run Code Online (Sandbox Code Playgroud)
请注意我们在做as.character(x)之前需要先做的事情as.numeric().额外调用在将其转换为数字之前对级别信息进行编码.为了说明为什么这事,注意什么dat3$a是
> dat3$a
[1] 1 2 2 3 1 3 3 2 2 1
Levels: 3 2 1
Run Code Online (Sandbox Code Playgroud)
如果我们只是将它转换为数字,我们得到错误的数据,因为R转换底层的代码
> as.numeric(dat3$a)
[1] 3 2 2 1 3 1 1 2 2 3
Run Code Online (Sandbox Code Playgroud)
如果我们首先将因子强制转换为字符向量,然后转换为数字,我们保留原始信息而不是R的内部表示
> as.numeric(as.character(dat3$a))
[1] 1 2 2 3 1 3 3 2 2 1
Run Code Online (Sandbox Code Playgroud)
如果您的数据类似于第二个示例,则您不能使用简单data.matrix()技巧,因为这与as.numeric()直接应用于因子相同,并且如第二个示例所示,这不会保留原始信息.