使用开始和结束列的名称选择连续范围的data.frame列

时间:2016-06-05 21:24:09

标签: r dataframe

我正在尝试使用列名称的间隔对data.frame的列进行子集化。

例如,data.frame A

A
ID1 ID2 ID3
1   5  01901
2   5  01902

例如,我想创建带有A:

列的变量b
b=A[,"ID2":"ID3"]
  

“ID1”出错:“ID3”:NA / NaN参数另外:警告信息:   1:在[.data.frame(A ,,“ID1”:“ID3”):强制2引入的NA:   在[.data.frame(A ,,“ID1”:“ID3”):由强制引入的NA

我想要的解决方案:

b
ID2 ID3
5  01901
5  01902

当我放置列的索引时,它可以工作。但是当我使用列名时,如上所述,则不起作用。

5 个答案:

答案 0 :(得分:4)

base R data.frame中的两种方法:

  • 命名向量列子集
  • 间隔方法

命名向量列子集

首先,按已知名称分组:

b = A[, c('ID2', 'ID3')]

区间方法

其次,在知道列相同的时间间隔内按子集划分:

# Column Variables
colvars = names(A)

# Get the first ID
start_loc = match("ID1",colvars)

# Get the second ID
end_loc = match("ID3",colvars)

# Subset range
b = A[,start_loc:end_loc]

答案 1 :(得分:3)

如果您不限于data.frame,可以将其转换为data.table,然后您的公式将起作用:

data.table::setDT(A)[, ID2:ID3, with=F]

   ID2  ID3
1:   5 1901
2:   5 1902

答案 2 :(得分:0)

使用if firstName.length > 0 && lastName.length > 0 { } 函数,然后在使用列名

时有效
c()

答案 3 :(得分:0)

您想使用列名而不是数字来选择列间隔,对吗? 为什么不呢?

> b <- A[,c((which(colnames(A)=="ID2")):(which(colnames(A)=="ID3")))]
> b
# ID2 ID3
# 1 5 1901
# 2 5 1902

答案 4 :(得分:0)

如果我们想使用 dplyr

# create data frame A
A <- data.frame (ID1 = c("1", "2"),
             ID2 = c("5", "5"),
             ID3 = c("01901", "01902")
             )

# print A
A

# get data frame B
B <- A %>% select(ID2:ID3)

# print B
B