折叠数据框以识别列中的所有变体

时间:2018-03-11 05:44:27

标签: r

我有以下data.frame:

x <- structure(list(X1 = c("NA", "NA", "NA", "NA", "NA", "NA"), X2 = c("NA", 
"NA", "NA", "STREET_NAME", "NA", "NA"), X3 = c("NA", "NA", "NA", 
"NA", "STREET_TYPE_CODE", "NA"), X4 = c("NA", "LOCALITY_NAME", 
"NA", "STREET_NAME", "NA", "NA"), X5 = c("NA", "NA", "NA", "STREET_NAME", 
"NA", "STATE")), .Names = c("X1", "X2", "X3", "X4", "X5"), row.names = c(NA, 
-6L), class = "data.frame")

理想情况下,我想要折叠数据框并删除&#34; NA&#34;值。

如果整个专栏包含&#34; NA&#34;,我想将该列分类为&#34; UNKNOWN&#34;。

然后我想使用类似于expand.grid的函数来创建每行中所有变体的数据框,而不是&#34; NA&#34;,所以在上面的例子中它将返回(类似) ...

     Var1        Var2             Var3          Var4        Var5
1 UNKNOWN STREET_NAME STREET_TYPE_CODE LOCALITY_NAME STREET_NAME
2 UNKNOWN STREET_NAME STREET_TYPE_CODE   STREET_NAME STREET_NAME
3 UNKNOWN STREET_NAME STREET_TYPE_CODE LOCALITY_NAME       STATE
4 UNKNOWN STREET_NAME STREET_TYPE_CODE   STREET_NAME       STATE

我正在迭代数千个类似于上面x的data.frames,但是,它们都有不同的尺寸。

我可以很容易地通过for循环来做到这一点,但是,希望尽可能简洁快速。

干杯

1 个答案:

答案 0 :(得分:4)

我们可以遍历列,获取不是缺失值的unique元素(x != "NA" - 在OP的数据集中,引用了缺失值,这是不正确的方式处理缺失值。应该是不加引号,即NA,然后我们可以使用is.nacomplete.cases等),并执行expand.grid

res <- expand.grid(lapply(x, function(x) {
         x1 <- unique(x[x!= "NA"])
       if(length(x1)==0) "UNKNOWN" else x1}))
names(res) <- paste0("Var", seq_along(res))
res
#    Var1        Var2             Var3          Var4        Var5
#1 UNKNOWN STREET_NAME STREET_TYPE_CODE LOCALITY_NAME STREET_NAME
#2 UNKNOWN STREET_NAME STREET_TYPE_CODE   STREET_NAME STREET_NAME
#3 UNKNOWN STREET_NAME STREET_TYPE_CODE LOCALITY_NAME       STATE
#4 UNKNOWN STREET_NAME STREET_TYPE_CODE   STREET_NAME       STATE

或者可以使用tidyverse

完成此操作
library(tidyverse)
x %>%
    summarise_all(funs(list(unique(.[.!= "NA"])))) %>% 
    map(~ if(lengths(.x)==0) "UNKNOWN" else unlist(.x))  %>%
    expand.grid %>%
    rename_all(~ paste0("Var", 1:5))
相关问题