首页 文章

R子集数据帧由两个向量组成

提问于
浏览
1

我有一个数据框和两个名为 leftright 的整数向量 .

我想以这样的方式创建数据帧的子集,使得向量中的数字将指示要包括在子集中的列的范围 .

例如,对于数据框中的第n行,我想保留值 df[n,left[n]:right[n] . 我尝试使用 mapply() 这样做:

aligned_rows<-apply(df,1,
                function(x) mapply(function(y,z)x[y:z], left, right))

但得到的输出没有任何意义 .

3 回答

  • 0

    如上所述问题尚不清楚,希望下面的例子会给出一些提示:

    #dummy data
    df <- data.frame(matrix(runif(20,1,50),nrow=4))
    
    #right left dummy
    right <- c(1,3,4)
    left <- c(5,4,5)
    
    #nth value, also try n <- c(2,4) to get 2nd and 4th rows
    n <- 2
    
    #return list of data.frames
    lapply(1:length(right),
           function(x) df[n,right[x]:left[x]])
    
  • 2

    这个命令可以解决问题:

    as.data.frame(t(mapply(function(x,y,z) df[x,y:z],
                           x=seq_len(nrow(df)),y=left,z=right)))
    

    这是一个例子:

    set.seed(10)
    df <- data.frame(replicate(8,runif(4)))
    
    #    X1    X2    X3    X4    X5    X6    X7    X8
    #  0.51  0.09  0.62  0.11  0.05  0.86  0.41  0.77
    #  0.31  0.23  0.43  0.60  0.26  0.62  0.71  0.36
    #  0.43  0.28  0.65  0.36  0.40  0.78  0.84  0.54
    #  0.69  0.27  0.57  0.43  0.84  0.36  0.24  0.09
    

    应用

    left <- c(1,3,5,7)
    right <- c(2,4,6,8)
    as.data.frame(t(mapply(function(x,y,z) df[x,y:z],
                           x=seq_len(nrow(df)),y=left,z=right)))
    

    产量

    #    X1    X2
    #  0.51  0.09
    #  0.43  0.60
    #  0.40  0.78
    #  0.24  0.09
    

    为了使其起作用, leftright 定义的每个范围必须包含相同数量的元素 . 此外, leftright 必须包含与 df 中的行一样多的元素 .

  • 0

    没有更多信息,您的问题是不适合的,因为无法保证每行中您想要的项目数量是相同的 . 请记住,数据框是一个矩形对象,即所有行必须具有相同的长度 .

    获得更合理的是一个列表,它没有这个限制:

    mapply(function(l, r) df[, l:r], left, right, SIMPLIFY=FALSE)
    

    假设这导致每行的项目数相同,则可以将它们与 rbind 组合:

    do.call(rbind, mapply(function(l, r) df[, l:r], left, right, SIMPLIFY=FALSE))
    

    还有其他问题,例如,您可能将来自不同列的项目组合在一起,如果它们具有不同的类,那将是荒谬的 . 但是你没有提到这个问题,所以我假设你的数据框实际上更类似于一种矩阵,这种操作更为明智 .

相关问题