7

因此,如果我有一个看起来像这样的数据框:

             A     B      C  
  rowname1   4.5   4      3.2
  rowname2   3     23     9

如何让 R 给我包含特定数字的行/列的名称?

即,如果我给出值 3,它会返回

 rowname2,A
4

3 回答 3

19

假设没有重复,您可以whicharr.ind参数结合使用:

df <- data.frame(matrix(sample(1:100,12), ncol=3))
#    X1 X2 X3
# 1  84 58 36
# 2   9 40 92
# 3 100 28 78
# 4  15 98 29

index <- which(df==36, arr.ind=TRUE)
#      row col
# [1,]   1   3

如果您必须拥有该位置的实际行名和列名,则只需适当地对它们进行索引:

paste(rownames(df)[index[1]], colnames(df)[index[2]], sep=", ")
# [1] "1, X3"
于 2012-09-17T18:08:55.227 回答
4

可能正在编写一个简单的函数可以帮助你:

Which.names <- function(DF, value){
   ind <- which(DF==value, arr.ind=TRUE)
   paste(rownames(DF)[ind[1:nrow(ind)]],  colnames(DF)[ind[2]], sep=', ')
}

  DF <- read.table(text="A     B      C  
  rowname1   4.5   4      3.2
  rowname2   3     23     9", header=TRUE)

  Which.names(DF, value=3)
[1] "rowname2, A"

  Which.names(DF, value=4.5)
[1] "rowname1, A"

  Which.names(DF, value=9.0)
[1] "rowname2, C"

它还允许您使用重复值。

 DF[1,1] <-3.0 
 Which.names(DF, value=3)
[1] "rowname1, B" "rowname2, B" 

 DF[1,2] <- 3
 Which.names(DF, value=3)
[1] "rowname1, B" "rowname2, B" "rowname1, B"
于 2012-09-17T18:49:25.543 回答
-1

Jilber的回答中的代码有一些问题,需要稍微改动一下,应该是这样的(R版本3.1.2):

两者都有效(注意这两个函数的首字母“W”和“w”之间的区别)

第一

Which.names <- function(DF, value){
   ind <- which(DF==value, arr.ind=TRUE)
   for (i in 1:nrow(ind)) print(paste(rownames(DF)[ind[i,"row"]],  colnames(DF)[ind[i,"col"]], sep=', '))
}

第二个(更好的一个)

which.names <- function(DF, value){
   ind <- which(DF==value, arr.ind=TRUE)
   print(paste(rownames(DF)[ind[,"row"]],  colnames(DF)[ind[,"col"]], sep=', '))
}

结果在下面

> DF <- read.table(text="A     B      C  
+   rowname1   4.5   4      3.2
+   rowname2   3     23     9", header=TRUE)
> DF
           A  B   C
rowname1 4.5  4 3.2
rowname2 3.0 23 9.0
> Which.names(DF,3)
[1] "rowname2, A"
> which.names(DF,3)
[1] "rowname2, A"
> Which.names(DF,4)
[1] "rowname1, B"
> which.names(DF,4)
[1] "rowname1, B"
> Which.names(DF,9)
[1] "rowname2, C"
> which.names(DF,9)
[1] "rowname2, C"
> DF[1,1] <-3.0
> DF
         A  B   C
rowname1 3  4 3.2
rowname2 3 23 9.0
> Which.names(DF,3)
[1] "rowname1, A"
[1] "rowname2, A"
> which.names(DF,3)
[1] "rowname1, A" "rowname2, A"
> DF[1,2] <- 3
> DF
         A  B   C
rowname1 3  3 3.2
rowname2 3 23 9.0
> Which.names(DF,3)
[1] "rowname1, A"
[1] "rowname2, A"
[1] "rowname1, B"
> which.names(DF,3)
[1] "rowname1, A" "rowname2, A" "rowname1, B"
于 2015-03-29T21:00:26.337 回答