在R中分类:通过查找值为true的行返回行号

时间:2018-05-30 18:36:53

标签: r dataframe

我有一个分类数据框,其中类别位于最左侧的列中,值位于右侧的值中,如下所示:

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

我想要一个向量并为它们分配类别,以便向量

Toyota, UA, Reebok, Nestle

将返回

car, shoe, shoe, food

这听起来很容易(也可能是),但%in%仅在匹配向量中的值时才有效,所以我不知道如何做到这一点。 如何在整个数据框中执行此操作?

2 个答案:

答案 0 :(得分:1)

可能有更简单的方法,但你可以尝试

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)]

答案 1 :(得分:1)

由于这似乎假设框架中的所有字段都是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更快。