拉取特定行
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
使用 dplyr
和 tidyr
:
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
假设我有一个如下所示的数据框...
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
使用 dplyr
和 tidyr
:
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