【问题标题】:Subsetting a data frame by rows, dependent on the column number in R根据 R 中的列号,逐行对数据框进行子集
【发布时间】:2015-05-28 13:46:53
【问题描述】:

我想将 R 中的数据框按不同的行数进行子集化,具体取决于数据所在的列。例如,我们从这个数据框开始:

df <- data.frame(t1 = c(1:6), t2 = c(4:9), t3 = (7:12), t4 = c(12:17), t5 = c(18:23))

df
  t1 t2 t3 t4 t5
1  1  4  7 12 18
2  2  5  8 13 19
3  3  6  9 14 20
4  4  7 10 15 21
5  5  8 11 16 22
6  6  9 12 17 23

现在,我想通过捕获 t1 列的 5:6 行、t2 列的 4:5 行、t3 列的 3:4 行等来对数据框进行子集化(例如,1 行高我们输出的每一列都有 2 个数据点),因此新的数据帧如下所示:

df2
  t1 t2 t3 t4 t5
1  5  7  9 13 18
2  6  8 10 14 19

我的实际工作问题最多可以有 50 列,所以我希望能够使用一个干净、简单的函数,我确信它就在那里。

提前致谢。

【问题讨论】:

    标签: r subset


    【解决方案1】:

    您可以使用sapply,例如:

    df <- data.frame(t1 = c(1:6), t2 = c(4:9), t3 = (7:12), t4 = c(12:17), t5 = c(18:23))
    m <-sapply(1:ncol(df), function(i){
      df[(6-i):(7-i),i]
      })
    df2 <- data.frame(m)
    colnames(df2) <- colnames(df)
    

    【讨论】:

      【解决方案2】:

      你可以试试

      n <- nrow(df)
      s1 <- 1:ncol(df)
      df2 <- as.data.frame(matrix(df[cbind(c(n-1, n) - rep((s1-1), each=2), 
               rep(s1,each=2))],ncol=ncol(df), dimnames=list(NULL, names(df))))
      df2
      #  t1 t2 t3 t4 t5
      #1  5  7  9 13 18
      #2  6  8 10 14 19
      

      【讨论】:

        猜你喜欢
        • 2013-08-15
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        • 2020-08-19
        • 2021-10-13
        相关资源
        最近更新 更多