我遇到以下问题:
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
答案 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"]]
。