从r中列表的随机采样数据帧中选择第一个百分比的行

时间:2017-04-03 02:16:47

标签: r list function dataframe lapply

我写了一个函数,它从数据帧中选择第一个百分比的行(即阈值),这也适用于列表的数据帧。功能如下:

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行。怎么解决这个问题?

2 个答案:

答案 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.