输出列索引基于data.frame中的每一行

时间:2014-07-30 03:46:12

标签: r dataframe

我有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

3 个答案:

答案 0 :(得分:3)

您可以将whicht一起使用,但@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