在R中的模式colname之后动态子集数据帧

时间:2016-08-04 08:36:55

标签: r dataframe subset

输入(df)

> df
  gender age LIST_12 LIST_24 LIST_42 anxious happy nervous
1     11  12      20      18      29      31     6      28
2     35  25      26      23       9      34    13      21
3     20   8      28      27      26      26    34      29
4     24  35      10      11      18      25    26       3
5     34   8       4       3      29      33    25      35

所需的输出(dfSubset)

在LIST_结束后获取仅包含列的子集的最佳方法是什么。在这种情况下,我只想分配:焦虑,快乐和紧张的专栏。

  anxious happy nervous
1      31     6      28
2      34    13      21
3      26    34      29
4      25    26       3
5      33    25      35

的相关信息

我知道我可以运行以下代码,以便仅对以LIST_开头的列名进行子集化。但这不是我要找的......

dfSubset = subset(x = df, select =  grep("LIST_", names(df)))
dfSubset

可重复的来源

df <- structure(list(gender = c(11L, 35L, 20L, 24L, 34L), age = c(12L, 
25L, 8L, 35L, 8L), LIST_12 = c(20L, 26L, 28L, 10L, 4L), LIST_24 = c(18L, 
23L, 27L, 11L, 3L), LIST_42 = c(29L, 9L, 26L, 18L, 29L), anxious = c(31L, 
34L, 26L, 25L, 33L), happy = c(6L, 13L, 34L, 26L, 25L), nervous = c(28L, 
21L, 29L, 3L, 35L)), .Names = c("gender", "age", "LIST_12", "LIST_24", 
"LIST_42", "anxious", "happy", "nervous"), class = "data.frame", row.names = c(NA, 
-5L))

2 个答案:

答案 0 :(得分:2)

您可以找到哪一列是以LIST开头的最后一列,添加1,并使用该数字开始列数到列。

df[(max(grep("^LIST", names(df))) + 1):ncol(df)]
#   anxious happy nervous
# 1      31     6      28
# 2      34    13      21
# 3      26    34      29
# 4      25    26       3
# 5      33    25      35

答案 1 :(得分:1)

我们可以使用select

中的dplyr
library(dplyr)
df %>%
   select(-matches("LIST|gender|age"))
#    anxious happy nervous
#1      31     6      28
#2      34    13      21
#3      26    34      29
#4      25    26       3
#5      33    25      35

或者可能是

df %>% 
     select((tail(matches("LIST"),1)+1):ncol(.))