我正在尝试对数据集运行log2
转换,但是我不断收到一条错误消息,提示“数据框中的非数字变量”。我的数据有row.names = 1
和header = TRUE
,并且属于data.frame()
我尝试添加lappy(na.strings)
,但这不能解决问题
Shared_DEGs <- cbind(UT.Degs_heatmap[2:11], MT.Degs_heatmap[2:11], HT.Degs_heatmap[2:11])
Shared_DEGs1 <- `row.names<-`(Shared_DEGs, (UT.Degs_heatmap[,1]))
MyData.INF.log2 <- log2(Shared_DEGs1)
数据应该被log2转换为输出
答案 0 :(得分:3)
请勿尝试在整个log2
上运行data.frame
(或其他数值计算),而需要按列 进行。由于我们没有您的数据,因此我将生成一些内容来充分证明:
mydf <- data.frame(num = pi, int = 5L, chr = "A", lgl = TRUE, stringsAsFactors = FALSE)
mydf
# num int chr lgl
# 1 3.141593 5 A TRUE
isnum <- sapply(mydf, is.numeric)
isnum
# num int chr lgl
# TRUE TRUE FALSE FALSE
mydf[,isnum] <- lapply(mydf[,isnum], log2)
mydf
# num int chr lgl
# 1 1.651496 2.321928 A TRUE
我在这里做什么:
isnum
是numeric
的列子集(整数或浮点数)。可以扩展此逻辑索引,以完全包括“无负面” 或“无NA
s” 之类的东西。mydf[,isnum]
将数据子集划分为那些列lapply(mydf[,isnum], log2)
对子帧的每一列(每一列分别运行)运行功能log2
;传递给log2
的是数字的向量,而不是您尝试中的data.frame
mydf[,isnum] <- lapply(...)
:通常,如果我们执行mydf <- lapply(...)
,我们将存储一个list
,它将覆盖您以前的实例(丢失非数字列),并且不再显示框架,因此使用基础的R函数[<-
(分配给子集),我们替换了框架的组成部分(a)保留了其他列,并且(b)替换了父框架的“类”。答案 1 :(得分:3)
另一种使用base R
的{{1}}的方式,是使用@ r2evans提供的数据。
rapply
答案 2 :(得分:1)
我总是建议使用“ tidyverse”处理数据帧。使用install.packages('tidyverse')
library(tidyverse)
log2_transformed <- mutate_if(your_data, is.numeric, log2)