示例data.frame:
structure(list(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9)), .Names = c("a", "b", "c"), row.names = c(NA, -3L), class = "data.frame")
输出:
df
# a b c
# 1 1 4 7
# 2 2 5 8
# 3 3 6 9
我想获得第一列和第三列,但我希望按名称和列索引进行分组。
df[, "a"]
# [1] 1 2 3
df[, 3]
# [1] 7 8 9
df[, c("a", 3)]
# Error in `[.data.frame`(df, , c("a", 3)) : undefined columns selected
df[, c(match("a", names(df)), 3)]
# a c
# 1 1 7
# 2 2 8
# 3 3 9
是否有允许干净/简单语法的函数或包,如第三个示例中所示,同时还实现了第四个示例的结果?
答案 0 :(得分:1)
Mabe使用dplyr
?
用于交互式使用 - 即,如果您提前知道要选择的列的名称
library(dplyr)
df %>% select(a, 3)
如果您事先不知道列的名称,并希望将其作为变量传递,
x <- names(df)[1]
x
[1] "a"
df %>% select_(x, 3)
无论哪种方式输出都是
# a c
#1 1 7
#2 2 8
#3 3 9
答案 1 :(得分:1)
在基础 R 中,您可以将 subset
与 select
结合使用。
df <- structure(list(a = c(1, 2, 3),
b = c(4, 5, 6), c = c(7, 8, 9)),
.Names = c("a", "b", "c"), row.names = c(NA, -3L), class = "data.frame")
df <- subset(df, select = c(a, 3))
答案 2 :(得分:0)
您可以在不使用 dplyr 的情况下索引 names(df)
:
df <- structure(list(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9)), .Names = c("a", "b", "c"), row.names = c(NA, -3L), class = "data.frame")
df[,c("a",names(df)[3]) ]
输出:
a c
1 1 7
2 2 8
3 3 9