【问题标题】:assign first 25 percent of rows as T and others as F from dataframes of list从列表的数据帧中将前 25% 的行分配为 T,将其他行分配为 F
【发布时间】:2017-04-09 05:53:42
【问题描述】:

我在列表中有一个随机采样的数据帧行列表。我想将所有数据框中的前 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)

在这个数据框列表中,我想将前 25% 的行指定为 F,将所有其他行指定为 T。如何执行此操作?

【问题讨论】:

    标签: r list if-statement dataframe


    【解决方案1】:

    您可以轻松编写如下函数以在lapply 中使用:

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

    那么用法就是lapply(my_list, myFun)

    【讨论】:

    • 谢谢。此函数添加一个新列。我不想添加新列。但是如果有更多列,我想将其应用于所有现有列或第 2 到 4 列。您能对此添加更多评论吗?
    • @AnwarHossain,当然。提供一些可重现的输入所需的输出,我很乐意提供帮助。
    • 另请注意,在创建额外列后,如果您希望它们位于不同的 data.frames 中,您可以只使用 split 数据。
    • 谢谢。关于您的第二条评论的想法很好,但考虑到我的数据量,这将带来很多额外的工作。你能看到这个帖子吗:link?我在那里收到了一条评论,但这并没有解决问题。最好编辑该功能或制作可以这样工作的新功能。任何帮助将不胜感激。
    • @AnwarHossain,你到底想做什么?例如,在得到你的“T”和“F”或者你的“H”和“L”之后,你打算用它做什么?另外,如果您关心大数据的效率,您是否考虑过使用data.table
    【解决方案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)
    

    【讨论】:

      【解决方案3】:

      改编自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)
      }
      

      现在任何阈值都适合。

      【讨论】:

        猜你喜欢
        • 2016-12-06
        • 1970-01-01
        • 2014-12-15
        • 2021-08-27
        • 2019-06-16
        • 2020-02-13
        • 2020-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多