源代码
#' @title remove observation with too many 0 values
#' @param data dataframe of imported dataset, must have first column as ID
#' @param x scales indicate how many 0 to remove
#' @return a dataframe without too many 0 observations
#' @examples
#' data_cleaning(matrix(c(c(0,1,1,0,0,1,1), c(2,1,0,3,5,2,2), c(1,1,3,2,4,5,1)), 3, 7), 2)
#' @importFrom stats aggregate
#' @export
data_cleaning <- function(data, x = round(ncol(data)*0.3)){
data = aggregate(data[,2:ncol(data)], by=list(data[,1]), FUN = 'sum')
rownames(data) = data[,1]
data = data[,-1]
tmp = apply(data, 1, function(c) which( as.numeric(c) != 0) )
keep_no = which(sapply(tmp, length) >= x)
data2 = data[keep_no,]
return(data2)
}
这段R语言代码是一个自定义函数,名为 data_cleaning,用于从数据集中移除包含过多0值的观测(行)。下面是对这段代码的中文解释:
@title remove observation with too many 0 values:该函数的标题,目的是移除包含过多0值的观测。@param data:参数data,代表导入的数据框(dataframe),必须要第一列作为ID(标识)列。@param x:参数x,表示移除观测的阈值,即当一行中0的个数超过这个值时,这一行将被移除。@return:返回值,返回一个清理后的数据框,即移除了包含过多0值的观测后的数据。@examples:示例用法,展示了如何使用这个函数。@importFrom stats aggregate:表示从stats包中导入aggregate函数。@export:表示该函数应该被导出,使得它可以在该R包的命名空间之外被用户访问。
函数定义 data_cleaning <- function(data, x = round(ncol(data)*0.3)){...}:定义了一个名为 data_cleaning 的函数,它接受两个参数:data 是需要清理的数据框,x 是一个用于标识多少个0值会导致一个观测被移除的阈值,默认值为数据框列数的30%(向下取整)。
函数内部操作解释:
-
data = aggregate(data[,2:ncol(data)], by=list(data[,1]), FUN = 'sum'):使用aggregate函数按照ID列(第一列)对数据进行分组并求和,忽略了ID列外的第一列。 -
rownames(data) = data[,1]:将分组后的数据框的行名设置为ID列的值。 -
data = data[,-1]:移除数据框的第一列(ID列),因为ID已经被设置为了行名。 -
tmp = apply(data, 1, function(c) which(as.numeric(c) != 0)):使用apply函数遍历数据框的每一行,找出每行中非0值的位置,并存储在tmp变量中。 -
keep_no = which(sapply(tmp, length) >= x):通过sapply函数计算每行非0值的数量,并找出数量大于等于阈值x的行的索引,即这些行会被保留。 -
data2 = data[keep_no,]:根据上一步得到的索引,从数据框中选取符合条件的行,得到清理后的数据框data2。 -
return(data2):返回清理后的数据框data2。
总结:这个函数的目的是从数据集中移除那些包含过多0值的行,仅保留那些非0值数量达到一定阈值的观测。通过调整参数 x,可以控制移除观测的严格程度。