如何通过名称,列索引和同时删除列来对数据框进行子集

时间:2018-09-12 11:54:56

标签: r

我的数据框如下:

product<-c("ab","ab","ab","ac","ac","ac")
shop<-c("sad","sad","sad","sadas","fghj","xzzv")
week<-c(31,31,32)
category<-c("a","a","a","b","b","b")
tempr<-c(35,35,14,24,14,5)
value<-c(0,0,-6,8,4,0)
store<-data.frame(product,shop,category,tempr,value)

如下所示:

  product  shop category tempr value
      ab   sad        a    35     0
      ab   sad        a    35     0
      ab   sad        a    14    -6
      ac   sadas      b    24     8
      ac   fghj       b    14     4
      ac   xzzv       b     5     0

我有一个问题可能是错误的,但我想通过按名称选择第二列,然后按索引号删除某些列(1、3、4),然后按索引选择其余列,来对该数据帧进行子集化数字不知道极限。像这样:

store2<-store2[,input$lux2,-c(1,3),4:]

让我们说我通过从selectInput中输入“ shop”来删除第1列和第3列,然后保留所有列。结果将是:

   shop tempr value
   sad    35     0
   sad    35     0
   sad    14    -6
  adas    24     8
  fghj    14     4
  xzzv     5     0

1 个答案:

答案 0 :(得分:1)

您不能按名称混合选择,否定选择和按索引进行选择。 您必须决定使用名称还是索引号。

类似的事情会起作用:

colByName = "shop"
removeByInd = c(1,3)
fromNtoEnd  = 4

ind <- setdiff(
    c( match(colByName, names(store)), fromNtoEnd:ncol(store) ),
    removeByInd
)

store2 <- store[,ind]

#   shop tempr value
#1   sad    35     0
#2   sad    35     0
#3   sad    14    -6
#4 sadas    24     8
#5  fghj    14     4
#6  xzzv     5     0

如果您考虑使用dplyr,则可以使用:

store %>% select(-c(1,3),"shop",4:ncol(.))

这与您在问题中的“想象力”非常接近。