我写了一个函数,它从数据帧中选择第一个百分比的行(即阈值),这也适用于列表的数据帧。功能如下:
set.threshold.rand <-function(value, vector){
print(length(vector))
n<-as.integer(length(vector)/100*value)
threshold<-vector[n]
return(threshold)
}
sensitivity.rand<-function(vector, threshold){
thresh<-set.threshold.rand(threshold, vector)
print(thresh)
score<-ifelse(vector<=thresh, "H", "L") # after taking the threshold values it assign them to 'H' and 'L' according to condition
return(score)
}
此函数从列表的数据帧中选择第一个百分比的行。例如,下面的代码选择前143行为&#34; H&#34;这是预期的。
vec.1 <- c(1:574)
vec.2 <- c(3001:3574)
df.1 <- data.frame(vec.1, vec.2)
df.2 <- data.frame(vec.2, vec.1)
my_list1 <- list(df.1, df.2)
my_list1 <- lapply(my_list1, function(x) {x[1] <- lapply(x[1], sensitivity.rand, threshold = 25)
x})
但是这不适用于列表的采样和复制数据帧(如下所示)。例如:
my_list <- replicate(10, df.1[sample(nrow(df.1)),] , simplify = FALSE)
my_list <- lapply(my_list, function(x) {x[1] <- lapply(x[1], sensitivity.rand, threshold = 25)
x})
这些选择超过300行。怎么解决这个问题?
答案 0 :(得分:1)
您的函数set.threshold.rand
依赖于输入向量已排序的事实。
这就是为什么它适用于my_list1
而不是my_list
,您使用sample()
对行进行了随机播放。
将threshold <- vector[n]
替换为threshold <- sort(vector)[n]
set.threshold.rand
答案 1 :(得分:0)
Adapted from answer given by #SirSaleh here:
sensitivity.rand <- function(vector, threshold){
num_to_thres <- floor(threshold*0.01*length(vector))
l = length (vector)
score = c(rep("H",num_to_thres),rep("L",l-num_to_thres))
return(score)
}
Now it can take any threshold and works with great efficacy.