我需要帮助R中可能相当简单的东西。我想引用数据框中的一系列列(例如,提取一些选择变量)。但是,我不知道他们的列号。通常情况下,如果我想提取4-10列,我会说mydata [,4:10]。
但是,鉴于我不知道列号,我想按名称引用它们。是否有捷径可寻?在sas或spss中,通过名称引用一系列变量相当容易。或者,是否有一种简单的方法可以确定哪个列号对应于R?
中的变量名称答案 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
我希望这也会有所帮助,类似于尼尔的回答。