我有一个分类数据框,其中类别位于最左侧的列中,值位于右侧的值中,如下所示:
car Chevy Honda Toyota
food Ritz Hershey Nestle
shoe Nike UA Reebok
我想要一个向量并为它们分配类别,以便向量
Toyota, UA, Reebok, Nestle
将返回
car, shoe, shoe, food
这听起来很容易(也可能是),但%in%
仅在匹配向量中的值时才有效,所以我不知道如何做到这一点。
如何在整个数据框中执行此操作?
答案 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
更快。