使用索引与列名称

时间:2014-03-11 14:27:09

标签: r subset

我遇到以下问题:

b <- some.data.frame
index.value = match(someCol,names(b)
#Head will return nothing:
c <- b[b[index.value] %in% some.list, ]
head(c)
#Head will return values:
c <- b[b$someCol %in% some.list, ]
head(c)

Head将为我返回0行。但是,如果我使用列的名称,它将起作用。是什么给了什么?

编辑:

以下是一个例子:

v0 <- c('A','B','C','B', 'C')
v1 <- c(1,2,3,4,12)
v2 <- c(5,6,7,8,34)
v3 <- c(10,15,54,75,45)

df.test <- data.frame(v0,v1,v2,v3)
some.list = c('B', 'C')

#Does not return values
index.value = match('v0',names(df.test))
df.test2 <- df.test[df.test[index.value] %in% some.list,  ] 
df.test2

#Return Values
df.test2 <- df.test[df.test$v0 %in% some.list,  ] 
df.test2

1 个答案:

答案 0 :(得分:0)

在第一组代码中,您使用df.test[index.value],它返回1列数据框:

str(df.test[index.value])
# 'data.frame': 5 obs. of  1 variable:
#  $ v0: Factor w/ 3 levels "A","B","C": 1 2 3 2 3

测试some.list中是否包含数据框将返回FALSE,因为some.list中没有匹配的数据框。

另一方面,df.test[[index.value]]将返回与编号为index.value的列对应的向量:

str(df.test[[index.value]])
# Factor w/ 3 levels "A","B","C": 1 2 3 2 3

因此,您的第一段代码将适用于此索引:

index.value = match('v0',names(df.test))
df.test2 <- df.test[df.test[[index.value]] %in% some.list,  ] 
df.test2
#   v0 v1 v2 v3
# 2  B  2  6 15
# 3  C  3  7 54
# 4  B  4  8 75
# 5  C 12 34 45

但是,有一种更简单的语法可以按名称从数据框中获取列:df.test[["v0"]]