按行子集数据帧,具体取决于R中的列号

时间:2015-05-28 13:46:54

标签: r subset

我想根据数据所在的列,将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列,所以我很乐意能够使用一个干净,简单的功能,我确信它就在那里。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以使用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)

答案 1 :(得分: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