我有data.frame
Orig <- c("HKG", "PEK", "PVG", "AMS")
stop2 <- c("", "HKG", "PEK", "HKG")
stop3 <- c("", "", "HKG", "")
Dest <- "X"
(data <- data.frame(Orig, stop2, stop3, Dest))
Orig stop2 stop3 Dest
1 HKG X
2 PEK HKG X
3 PVG PEK HKG X
4 AMS HKG X
对于每一行,我想输出HKG出现的列索引。 例如,对于第二行,“HKG”位于stop2,即第二列。所以,我希望输出为2。
所需的输出如下:
Orig stop2 stop3 Dest output
1 HKG X 1
2 PEK HKG X 2
3 PVG PEK HKG X 3
4 AMS HKG X 2
我最初的想法是使用which(=="HKG")
,但我只知道如何处理colnames
。
答案 0 :(得分:3)
您可以将which
与t
一起使用,但@thelatemail的回答更直观:
dat$output <- which(t(dat) == "HKG", arr.ind=TRUE)[,1]
# This next line does the same thing, and is perhaps more clear than using [,1]:
# dat$output <- which(t(dat) == "HKG", arr.ind=TRUE)[,"row"]
dat
# Orig stop2 stop3 Dest output
#1 HKG X 1
#2 PEK HKG X 2
#3 PVG PEK HKG X 3
#4 AMS HKG X 2
答案 1 :(得分:2)
apply
:
dat$output <- apply(dat[,-4],1,function(x) which(x=="HKG") )
如果速度很重要,请尝试以下操作,速度将提高约20倍。
intm <- dat[-4]=="HKG"
dat$output <- col(intm)[intm][order(row(intm)[intm])]
甚至更简单:
max.col(dat[-4]=="HKG")
全部导致:
# Orig stop2 stop3 Dest output
#1 HKG X 1
#2 PEK HKG X 2
#3 PVG PEK HKG X 3
#4 AMS HKG X 2
答案 2 :(得分:2)
indx <- (t(dat)=="HKG")*(seq_len(nrow(dat)))
indx[!!indx]
#[1] 1 2 3 2