如何在名称中包含特定字符串的R数据帧中选择变量?

时间:2011-09-26 22:45:26

标签: r grep

两个例子对我很有用。

我如何选择: 1)名称以b或B开头的变量(即不区分大小写) 要么 2)名称包含3

的变量
df <- data.frame(a1 = factor(c("Hi", "Med", "Hi", "Low"), 
  levels = c("Low", "Med", "Hi"), ordered = TRUE),
  a2 = c("A", "D", "A", "C"), a3 = c(8, 3, 9, 9),
  b1 = c(1, 1, 1, 2), b2 = c( 5, 4, 3,2), b3 = c(3, 4, 3, 4),
  B1 = c(3, 6, 4, 4))

3 个答案:

答案 0 :(得分:31)

如果您只想要变量名称:

grep("^[Bb]", names(df), value=TRUE)

grep("3", names(df), value=TRUE)

如果您想要选择这些列,那么

df[,grep("^[Bb]", names(df), value=TRUE)]
df[,grep("^[Bb]", names(df))]

第一个使用按名称选择,第二个使用按一组列号选择。

答案 1 :(得分:3)

虽然我喜欢上面的答案,但我也想提供一个“ tidyverse”解决方案。如果您像我经常做的那样做大量的管道并尝试一次做几件事,那么您可能会喜欢这个答案。另外,我发现此代码更具“人性化”可读性。

dplyr函数select_vars将根据第一个参数中的字符向量选择变量,该变量应包含诸如starts_with或{{1 }}

matches

请注意,library(dplyr) df <- data.frame(a1 = factor(c("Hi", "Med", "Hi", "Low"), levels = c("Low", "Med", "Hi"), ordered = TRUE), a2 = c("A", "D", "A", "C"), a3 = c(8, 3, 9, 9), b1 = c(1, 1, 1, 2), b2 = c( 5, 4, 3,2), b3 = c(3, 4, 3, 4), B1 = c(3, 6, 4, 4)) #will select the names starting with a "b" or a "B" select_vars(names(df), starts_with('b', ignore.case = TRUE)) #use select in conjunction with the previous code df %>% select(select_vars(names(df), starts_with('b', ignore.case = TRUE))) #Alternatively select_vars(names(df), matches('^[Bb]')) 的默认值为ignore.case,但我将其默认显示在此处,以防将来的读者好奇如何调整代码。也可以使用TRUEinclude参数。例如,如果您想要以“ B”或“ b”开头的所有内容,并且还希望包含“ a1”,则可以使用exclude

答案 2 :(得分:0)

我认为值得补充的是,select_varstidyverse起已退役。现在,1.2.1可能是您在“ tidyverse”中寻找的东西。请参阅文档here