子集R data.frame由索引和名称在一行中

时间:2016-08-08 15:47:38

标签: r dataframe

示例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

是否有允许干净/简单语法的函数或包,如第三个示例中所示,同时还实现了第四个示例的结果?

3 个答案:

答案 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 中,您可以将 subsetselect 结合使用。

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))

enter image description here

答案 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