2015-12-11 5 views
4

Я запустить в следующем выпускеR возвращения частичное соответствие имен строк

vec <- c("a11","b21","c31") 
df <- data.frame(a = c(0,0,0), b = c(1,1,1), row.names = vec) 
df["a",] 

возвращает

df["a",] 
    a b 
a11 0 1 

Однако

"a" %in% vec 

и

"a" %in% rownames(df) 

оба возвращаются False

R допускает частичное совпадение строки при использовании буквы, за которой следуют номера для имен строк. Я воспроизвел это на R v3.2.2 и R v3.2.1. Даже

df[["a",1,exact=T]] 

возвращает 0

Что я могу установить таким образом, что R не позволяет это частичное соответствие?

+1

Если вы ищете возможность отключить его, его нет. Похожие, но довольно непростые http://stackoverflow.com/questions/18033501/warning-when-partial-matching-rownames –

ответ

1

Почему бы не попробовать:

df[grep(pattern = "a", x = rownames(df)),] 

Что бы вернуть:

> df[grep(pattern = "a", x = rownames(df)),] 
    a b 
a11 0 1 

Используя grep обеспечит вам с дополнительной гибкости, например, если вы хотите, чтобы соответствовать имена строк которые будут иметь a только:

> df[grep(pattern = "^a$", x = rownames(df)),] 
[1] a b 
<0 rows> (or 0-length row.names) 
4

Weird, даже не понимают, что частичное соответствие была вещь.

Вместо индексации в dataframe непосредственно, вы могли бы попытаться определить записи, точное соответствие rowname отдельно и построить вектор индексации из результата, например, так:

> ix <- 'a' == row.names(df) 
> df[ix,] 
<0 rows> (or 0-length row.names) 

или что то же самое (но более сжато) :

> df['a' == row.names(df),] 

в качестве альтернативы, если вы принуждать объект к data.table он будет возвращать только точные совпадения:

> library(data.table) 
> dt <- data.table(df) 
> dt[,ix := vec] 
> setkey(dt, ix) 

> dt['a'] 
    a b ix 
1: NA NA a 

> dt['a11'] 
    a b ix 
1: 0 1 a11