Классификация в R: вернуть номер строки, найдя строку, где значение истинно - PullRequest
0 голосов
/ 30 мая 2018

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

car  Chevy  Honda   Toyota
food Ritz   Hershey Nestle
shoe Nike   UA      Reebok

Я хотел бы взять вектор и назначить категориидля них вектор

Toyota, UA, Reebok, Nestle

вернет

car, shoe, shoe, food

Это звучит достаточно просто (и, вероятно, так), но %in% работает только при сопоставлении значения в вектореЯ не уверен, как это сделать.Как я могу сделать это на всем фрейме данных?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Поскольку предполагается, что все поля в кадре равны character, мы можем рассматривать кадр как matrix.(Как правило, я не рекомендую использовать apply с кадрами, поэтому я включаю это ведущее предостережение.)

df <- read.table(header=FALSE, stringsAsFactors=FALSE, text="
car  Chevy  Honda   Toyota
food Ritz   Hershey Nestle
shoe Nike   UA      Reebok")
vec <- c('Toyota','UA','Reebok','Nestle')

Начинаем искать совпадения:

apply(df, 1, function(row) vec %in% row)
#       [,1]  [,2]  [,3]
# [1,]  TRUE FALSE FALSE
# [2,] FALSE FALSE  TRUE
# [3,] FALSE FALSE  TRUE
# [4,] FALSE  TRUE FALSE

Теперь мы можем работать надэта результирующая матрица для возврата, которая является первым столбцом в каждой строке:

apply(apply(df, 1, function(row) vec %in% row), 1,
      function(a) which(a)[1])
# [1] 1 3 3 2

Теперь нам просто нужно использовать это для индексации первого столбца:

df$V1[ apply(apply(df, 1, function(row) vec %in% row), 1,
             function(a) which(a)[1]) ]
# [1] "car"  "shoe" "shoe" "food"

Если все являетсяcharacter (и у вас много данных), вы можете обнаружить, что matrix быстрее.

0 голосов
/ 30 мая 2018

могут быть более простые способы, но вы можете попробовать

dat <- read.table(text="
car  Chevy  Honda   Toyota
food Ritz   Hershey Nestle
shoe Nike   UA      Reebok", header=F, stringsAsFactors=F)

Настройка таблицы поиска

library(reshape2)
long <- melt(dat, 'V1')

Совпадение в таблице поиска

test <- c('Toyota', 'UA', 'Reebok', 'Nestle')
long$V1[match(test, long$value)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...