429

我有一个包含 6 列的 R 数据框,我想创建一个只有三列的新数据框。

假设我的数据框是df,并且我想提取列ABE,这是我能弄清楚的唯一命令:

 data.frame(df$A,df$B,df$E)

有没有更紧凑的方法来做到这一点?

4

10 回答 10

494

您可以使用列名向量进行子集化。我非常喜欢这种方法,而不是那些将列名视为对象名(例如subset())的方法,尤其是在函数、包或应用程序中编程时。

# data for reproducible example
# (and to avoid confusion from trying to subset `stats::df`)
df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5])
# subset
df[c("A","B","E")]

注意没有逗号(即不是df[,c("A","B","C")])。那是因为df[,"A"]返回一个向量,而不是一个数据框。但df["A"]总是会返回一个数据框。

str(df["A"])
## 'data.frame':    1 obs. of  1 variable:
## $ A: int 1
str(df[,"A"])  # vector
##  int 1

感谢David Dorchies指出df[,"A"]返回向量而不是 data.frame,并感谢Antoine Fabri为我的原始解决方案(下)提出了更好的替代方案(上)。

# subset (original solution--not recommended)
df[,c("A","B","E")]  # returns a data.frame
df[,"A"]             # returns a vector
于 2012-04-10T02:44:34.523 回答
222

使用dplyr包,如果你的 data.frame 被调用df1

library(dplyr)

df1 %>%
  select(A, B, E)

这也可以在没有%>%管道的情况下写成:

select(df1, A, B, E)
于 2015-04-19T21:19:17.230 回答
110

这是函数的subset()作用:

> dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> subset(dat, select=c("A", "B"))
  A B
1 1 3
2 2 4
于 2012-04-10T09:50:05.020 回答
86

有两个明显的选择:Joshua Ulrich 的df[,c("A","B","E")]

df[,c(1,2,5)]

如在

> df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> df
  A B C D E F
1 1 3 5 7 8 9
2 2 4 6 7 8 9
> df[,c(1,2,5)]
  A B E
1 1 3 8
2 2 4 8
> df[,c("A","B","E")]
  A B E
1 1 3 8
2 2 4 8
于 2012-04-10T06:49:54.050 回答
20

仅出于某种原因

df[, (names(df) %in% c("A","B","E"))]

为我工作。所有上述语法都产生了“未定义的列选择”。

于 2017-10-12T18:12:23.843 回答
19

其中 df1 是您的原始数据框:

df2 <- subset(df1, select = c(1, 2, 5))
于 2016-06-10T11:34:19.543 回答
15

您还可以使用sqldf对 R 数据帧执行选择的包:

df1 <- sqldf("select A, B, E from df")

这给出了一个带有列的数据框作为输出df1:A、B、E。

于 2016-11-30T08:00:22.770 回答
4

您可以使用with

with(df, data.frame(A, B, E))
于 2019-05-22T09:49:02.497 回答
1
df<- dplyr::select ( df,A,B,C)

此外,您可以为新创建的数据分配不同的名称

data<- dplyr::select ( df,A,B,C)
于 2019-10-15T19:54:27.537 回答
0

[ 和子集不可替代:

[如果只选择一列,则返回一个向量。

df = data.frame(a="a",b="b")    

identical(
  df[,c("a")], 
  subset(df,select="a")
) 

identical(
  df[,c("a","b")],  
  subset(df,select=c("a","b"))
)
于 2016-11-09T15:32:24.753 回答