首页 > 解决方案 > 根据列名和行名从 R 中的表中查找值

问题描述

目前我希望在 R 中从下表中查找一个值。例如,如果我执行

eval(parse("Tableg1004"))

我会从 g 列和第 1004 行获得值,即“Y”。

Table  c g s o
 1000  2 N N N
 1001  3 Y N N
 1002  5 Y Y N
 1003  9 Y N N
 1004 11 Y N N
 1005 13 N N Y

我怎么能做到这一点?

标签: r

解决方案


我认为我们不应该/可以eval parse在这里使用表达式(请参阅上面 Ronak Shah 评论中的链接)。好的——也许我们可以。但我们绝对不应该。我们可以做的是将“查找表”加入数据:

lookup_table <- read.table(text="Table  c g s o
 1000  2 N N N
 1001  3 Y N N
 1002  5 Y Y N
 1003  9 Y N N
 1004 11 Y N N
 1005 13 N N Y", header=T, stringsAsFactors=F)

data_table <- data.frame(Table = 1000:1007,
                         v1 = 1:8)

data_table_joined <- merge(data_table, lookup_table[, c("Table", "g")], by="Table", all.x=TRUE)


  Table v1 g
1  1000  1 N
2  1001  2 Y
3  1002  3 Y
4  1003  4 Y
5  1004  5 Y
6  1005  6 N
7  1006  7 NA
8  1007  8 NA

或者我们创建一个函数,将要提取的列的值作为参数:

look_up <- function(t, c) {
  f <- function(t, c) {
    r <- lookup_table[lookup_table$Table %in% t, c]
    return(ifelse(is.null(r), NA, r))
  }
  return(unlist(mapply(FUN = f, t, c)))
}

我们可以像这样使用这个函数:

look_up(c(1005, 1005), c("g", "o"))

甚至像这样:

library(dplyr)
data_table %>% 
  mutate(from_lookup = look_up(Table, "o"))


  Table v1 from_lookup
1  1000  1           N
2  1001  2           N
3  1002  3           N
4  1003  4           N
5  1004  5           N
6  1005  6           Y
7  1006  7        <NA>
8  1007  8        <NA>

推荐阅读