拉取特定行

Pull specific rows

假设我有一个如下所示的数据框...

City <- c("x","x","y","y","z","z","a","a")
Number <-c(1,2,3,4,5,6,7,8)

mat <- cbind.data.frame(City ,Number)

"City"  "Number"
     x          1
     x          2  
     y          3
     y          4
     z          5
     z          6
     a          7
     a          8

现在我希望能够提取数据...

list <- c("x","y", "a")

想要的结果看起来像这样……

x  y a 
1  3 7 
2  4 8 

我尝试使用 which(list%in%City) 来帮助查找索引以从索引中提取数据,但这并没有产生我想要的行。

更新

确保当你使用 Chris 的答案时你的 "City" 的数据类型是 "chr" 否则你会弹出一条错误消息,就像我在使用 [=29 之前得到的一样=] 函数。

我将你的变量 list 重命名为 test,因为 list 是一个函数名。你可以这样做,使用 data.table:

matdt <- as.data.table(mat)
setkey(matdt, City)
sapply(test, function(x) matdt[x, Number])
     x y a
[1,] 1 3 7
[2,] 2 4 8

使用 dplyrtidyr:

mat %>%
  filter(City %in% c("x", "y", "a")) %>%
  group_by(City) %>%
  mutate(Index = 1:n()) %>%
  spread(City, Number) %>%
  select(-Index)

您需要将城市名称一一传递给提取函数。在这种情况下,sapply 将按照您的预期提供一个矩阵,但如果每个城市的结果数量不同,则返回的对象将是一个列表而不是矩阵:

sapply( list, function(city) mat[ mat$City %in% city, "Number"] )
     x y a
[1,] 1 3 7
[2,] 2 4 8