我一直在尝试使用R自动化部分工作流程。我必须在我正在使用的数据集中使用转换。
我已经创建了一个使用可选参数的小函数,以便可以转换传递的数据帧的全部或部分列。
该功能现在看起来像这样:
# Function:
# transformDivideThousand(dataframe, optional = vectorListOfVariables)
#
# Definition: This function applies a transformation, dividing variables by
# 1000. If the vector is passed it applies the transformation to all variables
# in the dataframe.
#
# Example: df <- transformDivideThousand (cases, c("label1","label2"))
#
# Source: http://stackoverflow.com/a/36912017/4417072
transformDivideThousand <- function(data_frame, listofvars){
if (missing(listofvars)) {
data_frame[, sapply(data_frame, is.numeric)] =
data_frame[, sapply(data_frame, is.numeric)]/1000
} else {
for (i in names(data_frame)) {
if (i %in% listofvars) {
data_frame[,i] = data_frame[,i]/1000
}
}
}
return(data_frame)
}
好的,现在我遇到了一个问题,我必须应用一个相当复杂的转换。这次应该:
所有这一切都应该保持在给定数据集的全部或部分列中运行函数的能力。
我找到了一种创建数据框子集的方法,其中SO的值最大且函数较小:
colMax <- function(data) sapply(data, max, na.rm = TRUE)
但是我在transformDivideThousand中应用它时会遇到各种各样的问题。
我真的在努力学习代码,到目前为止,试图对问题进行建模,我达到了以下几点:
transformPlusOneSqrt <- function(data_frame, listofvars){
if (missing(listofvars)) {
# Find the largest value
data_frame_max <- data_frame
colMax <- function(data) sapply(data, max)
data_frame_max <- colMax(data_frame_max)
# Subtract the previous value
data_frame[, sapply(data_frame, is.numeric)] =
data_frame[, sapply(data_frame, is.numeric)] -
data_frame_max[,sapply(data_frame_max, is.numeric)]
# Plus one
data_frame[, sapply(data_frame, is.numeric)] =
data_frame[, sapply(data_frame, is.numeric)] + 1
# Sqrt
data_frame[, sapply(data_frame, is.numeric)] =
sqrt(data_frame[, sapply(data_frame, is.numeric)])
# Now, dereflect
data_frame[, sapply(data_frame, is.numeric)] =
data_frame[, sapply(data_frame, is.numeric)] +
data_frame_max[,sapply(data_frame_max, is.numeric)]
} else { ### This part is untouched
for (i in names(data_frame)) {
if (i %in% listofvars) {
data_frame[,i] = data_frame[,i]/1000
}
}
}
return(data_frame)
}
但这不起作用,因为我得到了:
> teste<- transformPlusOneSqrt(semDti)
Show Traceback
Rerun with Debug
Error in Summary.factor(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, :
‘max’ not meaningful for factors
我希望能指出如何在一个函数中实现这种相当复杂的多任务转换。我不是在寻找代码,只是指针和建议。
感谢。
答案 0 :(得分:1)
问题在于max()
因此colMax
无法处理班级factor
的数据。
您有两个选择:
测试因子类数据(if(class(data_frame[,i]) == "factor")
)并在适当的地方转换为数字
使用此函数根据频率获取因子变量的max
:
MaxTable <- function(InVec, mult = FALSE) {
if (!is.factor(InVec)) InVec <- factor(InVec)
A <- tabulate(InVec)
if (isTRUE(mult)) {
levels(InVec)[A == max(A)]
}
else levels(InVec)[which.max(A)]
}