2017-04-09 41 views
1

我有列表中随机采样的数据帧行。我想在所有的数据帧作为T和其他行为F.分配行的第一个25%例如:将前25%的行分配为T,将其他行分配为F的列表中的数据帧

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_list <- replicate(10, df.1[sample(nrow(df.1)),] , simplify = FALSE) 

在dataframes的这个名单,我想分配行作为F的第一个25%和所有其他行作为T.如何做到这一点?

回答

2

您可以轻松地写出这样被内lapply使用下面的函数:然后

myFun <- function(indf) { 
    indf$vec.3 <- seq_len(nrow(indf)) <= .25*nrow(indf) 
    indf 
} 

用法也只是lapply(my_list, myFun)

+0

谢谢。该功能添加一个新列。我不想添加一个新列。但是,如果有更多列,我想将其应用于所有现有列或列2至4。您能否就此添加更多评论? –

+0

@AnwarHossain,当然。提供一些可重现的输入**和**所需的输出,我很乐意提供帮助。 – A5C1D2H2I1M1N2O1R2T1

+0

还要注意,在创建额外的列之后,如果您希望在不同的'data.frame'中使用它们,则可以“分割”数据。 – A5C1D2H2I1M1N2O1R2T1

2

猜测这是一个交叉验证的开头方法,您可以使用modelr -package

require(modelr) 
dat <- crossv_mc(df.1, 10, test = 0.25) 

现在DAT如下所示执行以下操作:

# A tibble: 10 × 3 
      train   test .id 
      <list>   <list> <chr> 
1 <S3: resample> <S3: resample> 01 
2 <S3: resample> <S3: resample> 02 
... 
10 <S3: resample> <S3: resample> 10 

所以,你有一列列车持有75%的数据,另一列列举测试数据。这相当于您的FALSE/TRUE拆分。

你可以用这个如下工作

(从?crossv_mc采用的例子)指定一个新列保存模型:

dat$mod <- lapply(dat$train, function(x){ 
    lm(vec.1 ~ vec.2, data = as.data.frame(x)) 
}) 

重要的部分是:as.data.frame(x)。如果你想访问你的数据使用它。请参阅?resample

运行与测试数据模型的一些统计数据:

mapply(rmse, dat$mod, dat$test) 
0

here从#SirSaleh的答案改编。

sensitivity.rand <- function(vector, threshold){ 
    num_to_thres <- floor(threshold*0.01*length(vector)) 
    l = length (vector) 
    score = c(rep("T",num_to_thres),rep("F",l-num_to_thres)) 
    return(score) 
} 

现在它适合采取任何阈值。