我有一个在所有列中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)
这是一种方式.查找是一个向量:
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)
| 归档时间: |
|
| 查看次数: |
1389 次 |
| 最近记录: |