如何制作行长不等的数据框?
How do you make a data frame with unequal row lengths?
我有一个大型数据框 ExprsData,其中包含多个数值和 NA 值。它看起来像这样:
Patient
Gene_A
Gene_C
Gene_D
patient1
12
16
NA
patient2
15
NA
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)
但是,当我尝试将我的函数应用于我的整个数据框时,出现以下错误:Error in (function (..., row.names = NULL, check.rows = FALSE , check.names = 真, :
参数表示不同的行数:14、15
我知道我收到此错误消息是因为我的专栏长度不同。我知道这是因为在我的函数中,我让它删除了 NA 值。我需要这样做,否则我 运行 稍后在函数中尝试缩放和居中时会遇到很多错误。
有没有办法制作具有不等列的数据框?有没有办法在缩放和居中后将“NA”重新插入我的数据框中以避免此错误?或者在某些列中插入空白单元格以便它们的长度都相同的方法?
这是您函数的更好版本,它不会从您的数据中删除任何 NA:
(但是,对于 x
,或者在 scale
和 center
都为 FALSE 的情况下,该函数仍然会在非数值上跳闸。但是可以问自己为什么scale 函数需要一个 scale yes or no parameter??)
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)
}
}
我有一个大型数据框 ExprsData,其中包含多个数值和 NA 值。它看起来像这样:
Patient | Gene_A | Gene_C | Gene_D |
---|---|---|---|
patient1 | 12 | 16 | NA |
patient2 | 15 | NA | 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)
但是,当我尝试将我的函数应用于我的整个数据框时,出现以下错误:Error in (function (..., row.names = NULL, check.rows = FALSE , check.names = 真, : 参数表示不同的行数:14、15
我知道我收到此错误消息是因为我的专栏长度不同。我知道这是因为在我的函数中,我让它删除了 NA 值。我需要这样做,否则我 运行 稍后在函数中尝试缩放和居中时会遇到很多错误。
有没有办法制作具有不等列的数据框?有没有办法在缩放和居中后将“NA”重新插入我的数据框中以避免此错误?或者在某些列中插入空白单元格以便它们的长度都相同的方法?
这是您函数的更好版本,它不会从您的数据中删除任何 NA:
(但是,对于 x
,或者在 scale
和 center
都为 FALSE 的情况下,该函数仍然会在非数值上跳闸。但是可以问自己为什么scale 函数需要一个 scale yes or no parameter??)
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)
}
}