首页 > 解决方案 > 如何制作行长不等的数据框?

问题描述

我有一个大数据框,ExprsData,有几个数字和 NA 值。它看起来像这样:

病人 基因_A 基因_C 基因_D
病人1 12 16 不适用
病人2 15 不适用 20

我的数据框有 15 行和 14 列。

我制作了一个函数,用于在我的数据框中缩放和居中值:

MyScale <- function (x, scale, center){
  removena <- x[!is.na(x)] #remove the NA values 
  meanofdata <- mean(removena) #calc the mean 
  stdofdata <- sd(removena) #calc the std
  
  
if (scale==TRUE){ #if scale is true
  calcvec <- (removena - meanofdata)/stdofdata 
  return(calcvec)
}else if (center ==TRUE){ #if vec is true 
  centervec <- removena - meanofdata
  return(centervec)
}
} 

我通过运行我的数据框的单列来测试我的功能,如下所示:

MyScale (ExprsData$Gene_C, scale = TRUE, center = TRUE)

效果很好!

接下来,我希望能够将我的函数应用于我的整个数据框,将其作为数据框输出,将其分配给对象,然后另存为 csv。

为此,我尝试了这个:

ExprsDataScaled <- as.data.frame(lapply(ExprsData, function(x) MyScale(x = x, scale = TRUE, center = TRUE)))
write.csv(ExprsDataScaled,"?path//filename.csv", row.names = TRUE)

但是,当我尝试将我的函数应用于我的整个数据框时,出现以下错误: (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments暗示不同的行数:14、15

我了解我收到此错误消息是因为我的列的长度不同。我知道这是因为在我的函数中,我让它删除了 NA 值。我需要这样做,否则当我稍后在函数中尝试缩放和居中时会遇到很多错误。

有没有办法制作一个列不相等的数据框?一旦它被缩放和居中以避免这个错误,有没有办法将“NA”重新插入我的数据框?或者一种在某些列中插入空白单元格以便它们都可以是相同长度的方法?

标签: rdataframefunctionrows

解决方案


这是您功能的更好版本,它不会从您的数据中删除任何 NA:

(但是,该函数仍然会触发 的非数值x,或者在scalecenter都为 FALSE 的情况下。但人们可能会问自己,为什么比例函数需要比例是或否参数??)

MyScale <- function (x, scale, center){
  meanofdata <- mean(x, na.rm = TRUE)
  stdofdata <- sd(x, na.rm = TRUE)
  
  if (scale==TRUE){
    calcvec <- (x - meanofdata)/stdofdata 
    return(calcvec)
  }else if (center ==TRUE){
    centervec <- x - meanofdata
    return(centervec)
  }
} 

推荐阅读