从 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])
我有一个 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])