我有以下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循环来做到这一点,但是,希望尽可能简洁快速。
干杯
答案 0 :(得分:4)
我们可以遍历列,获取不是缺失值的unique
元素(x != "NA"
- 在OP的数据集中,引用了缺失值,这是不正确的方式处理缺失值。应该是不加引号,即NA
,然后我们可以使用is.na
或complete.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))