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 не разрешал это частичное совпадение?

2 ответа

Странно, даже не подозревала, что частичное совпадение - это вещь.

Вместо непосредственного индексирования в фрейм данных, вы можете попытаться идентифицировать записи, которые точно совпадают по имени строки, отдельно и построить вектор индексации из результата, например, так:

> 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

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

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

Который вернется:

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

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

> df[grep(pattern = "^a$", x = rownames(df)),]
[1] a b
<0 rows> (or 0-length row.names)
Другие вопросы по тегам