从 data.frame 中查找 table

Make a lookup table from a data.frame

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

data <- data.frame(A = c("egg", "egg"), B = c(NA, "bacon"), C = c("ham", "ham"), D = c(NA, NA))

我如何使用它来创建下面表格的查找 table?

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"

编辑

根据下面 Frank 的回答,我试图让我的查找 table 引用多个值。

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

keys

$A
[1] "egg"

$B
[1] "bacon"

$C
[1] "ham"

$D
[1] "bacon"

vals

[1] "A" "B" "C" "D"

tapply(vals, keys, c)

Error in tapply(vals, keys, c) : arguments must have same length

这是一种方法。查找是一个向量:

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

lookup <- setNames(vals,keys)

我已将 NA 替换为 "NA",因为我不知道如何使用前者。

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


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

lookup <- tapply(vals,keys,c)

例如,用 keys <- sapply(data,function(x)if(is.factor(x))levels(x)else "bacon")vals 试试这个(就像下面 OP 的评论一样)。现在查找是一个列表,因此只能用双括号访问:lookup[["bacon"]]。反向查找像以前一样工作。


对于一般列类.如果data的列不是全因子,则if/else条件将需要修改或推广。这是来自评论的@akrun 通用解决方案的一个版本:

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