仅将log2转换应用于data.frame的数字列

时间:2019-05-28 17:33:45

标签: r dataframe

我正在尝试对数据集运行log2转换,但是我不断收到一条错误消息,提示“数据框中的非数字变量”。我的数据有row.names = 1header = 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转换为输出

3 个答案:

答案 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

我在这里做什么:

  • isnumnumeric的列子集(整数或浮点数)。可以扩展此逻辑索引,以完全包括“无负面” “无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)