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)