2017-04-09 39 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) 
} 

現在它適合採取任何閾值。