r-使用用户生成的函数对数据帧的2列进行排序,使1列的值小于相应的列

  • 本文关键字:1列 排序 小于 2列 用户 函数 数据帧 r function
  • 更新时间 :
  • 英文 :


我希望使用用户生成的函数对数据帧的2列进行排序,使1列的值小于相应的列。

例如,这里是起始数据集:

# base dataset
numerical_values_dataset_start <- 
data.frame(
A = c("0.798963315", "0.160710819", "0.247170125", "-0.910092611", "0.42959469", "0.710921651", "0.160710819"),
B = c("0.321418973", "0.710921651", "0.910092611", "0.42959469", "0.42959469", "0.42959469", "0.160710819"),
C = c("0.812661261", "0.146377668", "0.42959469", "0.710921651", "0.710921651", "0.710921651", "0.160710819")
)

这是所需的列:

# desired dataset
numerical_values_dataset_end <- 
data.frame(
A = c("0.798963315", "0.160710819", "0.247170125", "-0.910092611", "0.42959469", "0.710921651", "0.160710819"),
B = c("0.321418973", "0.146377668", "0.42959469", "0.42959469", "0.42959469", "0.42959469", "0.160710819"),
C = c("0.812661261", "0.710921651", "0.910092611", "0.710921651", "0.710921651", "0.710921651", "0.160710819")
)

本质上,我希望设置与数据集的列BC相关联的行,以便较小的值在列B中,较大的值在列C中。我还希望能够修改代码,以便更改函数使用的数据集。我试着自己做这个函数,但不起作用。

function_range_upper_and_lower_limit_dataset_setting <- 
# ---- NOTE: changes whole dataset
# ---- NOTE: lower_value == lower value in range being evaluated
# ---- NOTE: upper_value == lower value in range being evaluated
# ---- NOTE: dataset_name == data set being evaluated
# ---- NOTE: function_range_upper_and_lower_limit_dataset_setting == function name
function(upper_value, lower_value, dataset_name)
{
# ---- NOTE: # turns dataset into data frame
range_upper_and_lower_limit_dataset_setting_funct_object <- 
data.frame(
cbind(
names(lower_value) = lower_value,
names(upper_value) = upper_value
)
)
# ---- NOTE: # transforms values of interest into numeric form
range_upper_and_lower_limit_dataset_setting_funct_object$test_value <- as.numeric(as.character(range_upper_and_lower_limit_dataset_setting_funct_object$test_value))
range_upper_and_lower_limit_dataset_setting_funct_object$lower_value <- as.numeric(as.character(range_upper_and_lower_limit_dataset_setting_funct_object$lower_value))
range_upper_and_lower_limit_dataset_setting_funct_object$upper_value <- as.numeric(as.character(range_upper_and_lower_limit_dataset_setting_funct_object$upper_value))
# ---- NOTE: # sets data so lower_value <= upper_value
# ---- NOTE: ## creates storage variables
range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage <- range_upper_and_lower_limit_dataset_setting_funct_object$upper_value
range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage <- range_upper_and_lower_limit_dataset_setting_funct_object$lower_value
# ---- NOTE: ## creates upper_value
range_upper_and_lower_limit_dataset_setting_funct_object$upper_value <- 
ifelse(((range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage) > (range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage)), range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage,
ifelse(((range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage) < (range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage)), range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage,
ifelse(((range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage) == (range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage)), range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage,
NA
)))
# ---- NOTE: ## creates lower_value
range_upper_and_lower_limit_dataset_setting_funct_object$lower_value <- 
ifelse(((range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage) > (range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage)), range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage,
ifelse(((range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage) < (range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage)), range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage,
ifelse(((range_upper_and_lower_limit_dataset_setting_funct_object$upper_value_storage) == (range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage)), range_upper_and_lower_limit_dataset_setting_funct_object$lower_value_storage,
NA
)))
# ---- NOTE: creates range_upper_and_lower_limit_dataset_setting_funct_object_2 object 2 containing dataset_name
range_upper_and_lower_limit_dataset_setting_funct_object_2 <- data.frame(dataset_name)
# ---- NOTE: removes specific columns in range_upper_and_lower_limit_dataset_setting_funct_object_2
range_upper_and_lower_limit_dataset_setting_funct_object_3 <- data.frame(subset(range_upper_and_lower_limit_dataset_setting_funct_object_2, select = -c(colnames(range_upper_and_lower_limit_dataset_setting_funct_object))))
# ---- NOTE: binds upper and lower values to dataset of interest
range_upper_and_lower_limit_dataset_setting_funct_object_4 <- 
data.frame(
cbind(
range_upper_and_lower_limit_dataset_setting_funct_object_3,
range_upper_and_lower_limit_dataset_setting_funct_object$lower_value,
range_upper_and_lower_limit_dataset_setting_funct_object$upper value
)
)
# ---- NOTE: returns appropriate object
return(range_upper_and_lower_limit_dataset_setting_funct_object_4)
}

这可能吗?我可以使用我已经创建的函数来执行此操作吗?有没有其他方法可以用来完成这项任务?

我们非常感谢所有的帮助。

您可以按行对除A:之外的所有列的值进行排序

numerical_values_dataset_start <- type.convert(numerical_values_dataset_start, as.is = TRUE)
numerical_values_dataset_start[-1] <- t(apply(numerical_values_dataset_start[-1], 1, sort))
numerical_values_dataset_start
#           A         B         C
#1  0.7989633 0.3214190 0.8126613
#2  0.1607108 0.1463777 0.7109217
#3  0.2471701 0.4295947 0.9100926
#4 -0.9100926 0.4295947 0.7109217
#5  0.4295947 0.4295947 0.7109217
#6  0.7109217 0.4295947 0.7109217
#7  0.1607108 0.1607108 0.1607108

数字以字符串形式存储。我用type.convert把它们转换成实际数字。

最新更新