在R中按名称引用列的范围

时间:2013-12-04 07:06:03

标签: r variables dataframe names

我需要帮助R中可能相当简单的东西。我想引用数据框中的一系列列(例如,提取一些选择变量)。但是,我不知道他们的列号。通常情况下,如果我想提取4-10列,我会说mydata [,4:10]。

但是,鉴于我不知道列号,我想按名称引用它们。是否有捷径可寻?在sas或spss中,通过名称引用一系列变量相当容易。或者,是否有一种简单的方法可以确定哪个列号对应于R?

中的变量名称

6 个答案:

答案 0 :(得分:5)

获取一系列列可以通过多种方式完成。 subset(data.frame, select = name4:name10),虽然有效但很长。在我为一件简单的事情编写长命令而烦恼之前我曾经使用过它。我创建了一个函数来处理命名列/不记住大数据帧中的列号:

coln <- function(X){
  y <- rbind(seq(1,ncol(X)))
  colnames(y) <- colnames(X)
rownames(y) <- "col.number"
  return(y)} 

以下是它的工作原理:

df <- data.frame(a = 1:10, b =10:1, c = 1:10)
coln(df)
           a b c
col.number 1 2 3

现在你可以用号码打电话给他们,然后看看名字。

答案 1 :(得分:3)

可以从数据框内的列名中识别列号,如下所示:

which(colnames(mydf)=="a")

其中mydf是数据框,a是列号所需列的名称。

Source

这可用于创建列范围:

firstcol = which(colnames(x)=="a")
lastcol = which(colnames(x)=="b")

mydf[c(firstcol:lastcol)]

答案 2 :(得分:2)

%in%names()结合使用。它对于从数据框中获取一组列非常有用。当你想只保留一个子集并删除其余部分时,你可以否定表达式。在R控制台提示符下键入?"%in%"以获取更多详细信息。

set.seed(1234)
mydf <- data.frame(A = runif(5, 1, 2),
                   B = runif(5, 3, 4),
                   C = runif(5, 5, 6),
                   D = runif(5, 7, 8),
                   E = runif(5, 9, 10))
mydf

keep.cols <- c('A','D','E')
mydf[, names(mydf) %in% keep.cols]
drop.cols <- c('A','B','C')
mydf[, !names(mydf) %in% drop.cols]

数据框:

> mydf
         A        B        C        D        E
1 1.113703 3.640311 5.693591 7.837296 9.316612
2 1.622299 3.009496 5.544975 7.286223 9.302693
3 1.609275 3.232551 5.282734 7.266821 9.159046
4 1.623379 3.666084 5.923433 7.186723 9.039996
5 1.860915 3.514251 5.292316 7.232226 9.218800

列的子集:

> mydf[, names(mydf) %in% keep.cols]
         A        D        E
1 1.113703 7.837296 9.316612
2 1.622299 7.286223 9.302693
3 1.609275 7.266821 9.159046
4 1.623379 7.186723 9.039996
5 1.860915 7.232226 9.218800

保留列的子集并删除其余列:

> mydf[, !names(mydf) %in% drop.cols]
         D        E
1 7.837296 9.316612
2 7.286223 9.302693
3 7.266821 9.159046
4 7.186723 9.039996
5 7.232226 9.218800

答案 3 :(得分:1)

我想我想出来了,但这有点令人讨厌。以下是使用mtcars获取hp与do.call之间的列的示例,通常意味着有一种更简单的方法。

mtcars[do.call(seq, as.list(match(c("hp", "vs"), colnames(mtcars))))]

答案 4 :(得分:0)

这是一个有趣的小功能,它结合了Largh的答案背后的想法和一个方便的函数调用。要使用它,只需输入

即可

call.cols(mydata,“firstvarname”,“lastvarname”)

call.cols <- function(df, startvar, endvar) {
  col.num <- function(df){
    var.nums <- seq(1,ncol(df))
    names(var.nums) <- colnames(df)      
    return(var.nums)
  } 

 start.num <- as.numeric(col.num(df)[startvar])
 end.num <- as.numeric(col.num(df)[endvar])
 range.num <- start.num:end.num
 return(df[range.num]) 
}

我计划将其扩展用于心理测量研究的规模创建。

答案 5 :(得分:0)

您可以通过名称来调用列号:

<Link>

在这里您可以看到match()调用实际上给出了列号:

set.seed(1234)
> mydf <- data.frame(A = runif(5, 1, 2),
                     + B = runif(5, 3, 4),
                     + C = runif(5, 5, 6),
                     + D = runif(5, 7, 8),
                     + E = runif(5, 9, 10))
> mydf
mydf[c(match("A", names(mydf)):match("B", names(mydf)))]
         A        B
1 1.113703 3.640311
2 1.622299 3.009496
3 1.609275 3.232551
4 1.623379 3.666084
5 1.860915 3.514251

我希望这也会有所帮助,类似于尼尔的回答。