从data.frame创建一个查找表

wdk*_*nls 3 hash r

我有一个在所有列中data.frame只有一个唯一的非NA值,但只有一个,只有一个NA.

data <- data.frame(A = c("egg", "egg"), B = c(NA, "bacon"), C = c("ham", "ham"), D = c(NA, NA))
Run Code Online (Sandbox Code Playgroud)

如何使用它来创建下面表单的查找表?

lookup <- make_lookup(key=unique_values(data), value=names(data))
lookup[["egg"]] # returns "A"
lookup[["bacon"]] # returns "B"
lookup[["ham"]] # returns "C"
lookup[["NA"]] # returns "D"
Run Code Online (Sandbox Code Playgroud)

编辑

根据Frank的回答,我试图让我的查找表引用多个值.

keys <- lapply(data, function(x) if(is.factor(x)) levels(x) else "bacon")
vals <- names(data)
Run Code Online (Sandbox Code Playgroud)

按键

$A
[1] "egg"

$B
[1] "bacon"

$C
[1] "ham"

$D
[1] "bacon"
Run Code Online (Sandbox Code Playgroud)

瓦尔斯

[1] "A" "B" "C" "D"
Run Code Online (Sandbox Code Playgroud)

tapply(vals,keys,c)

Error in tapply(vals, keys, c) : arguments must have same length
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 5

这是一种方式.查找是一个向量:

keys <- sapply(data,function(x)if(is.factor(x))levels(x)else "NA")
vals <- names(data)

lookup <- setNames(vals,keys)
Run Code Online (Sandbox Code Playgroud)

我已经取而代之了NA,"NA"因为我无法弄清楚如何使用前者.

语法lookup[["egg"]]有效,但也有lookup["egg"].反向查找rlookup <- keys可以相同的方式访问:rlookup["A"].


对于具有多个值的键.如果键可能映射到值向量,请使用

lookup <- tapply(vals,keys,c)
Run Code Online (Sandbox Code Playgroud)

例如,如上所述(如下面的OP评论),尝试使用keys <- sapply(data,function(x)if(is.factor(x))levels(x)else "bacon")vals如上所述.现在查找是一个列表,所以只能用双括号访问:lookup[["bacon"]].反向查找与以前一样.


对于一般列类.如果列data不是所有因素,则需要修改/推广if/ else条件.以下是来自评论的@ akrun广义解决方案的版本:

keys <- sapply(data,function(x)c(unique(as.character(x)[!is.na(x)]),"NA")[1])
Run Code Online (Sandbox Code Playgroud)

  • 融化,哈希,鸡蛋,火腿,培根.我们需要的只是奶酪,是时候吃午饭了! (3认同)