r - 根据列名和行名从 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
我怎么能做到这一点?
解决方案
我认为我们不应该/可以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>
推荐阅读
- c# - 对于给定的输入数组,for循环不执行
- linux - Linux 上的 Jupyter:自动将所选文本复制到剪贴板 jupyter
- android - 我是否正确理解了 Google Play Open Test Track 的流程?
- c# - C# Razor 局部页面动态更新标签文本
- git - Failed to connect to github.com port 443 with command install.sh spi
- java - How to replace sun.awt.AppContext used to shutdown ExecutorService instances when context is disposed?
- postgresql - 如何在tomcat连接中定义模式属性
- c# - How to wait for Window content to resize before showing the window in C#?
- python - Deleting a specific element inside nested python dictionaries
- java - Serializing / Deserializing Polymorphic Container Objects Containing Other Polymorphic Container Objects To Json