根据“NA”值在新列中添加逻辑值

时间:2018-06-12 19:16:23

标签: r

假设我有这些数据:

name <- c("Name1","Name2","Name3","Name4",NA)
state <- c("State1","State2","State3","State4","State5")
id <- c("id1",NA,NA,"id4","id5")
size <- c(NA,"size2",NA,"size4",NA)

然后我创建了这个df

df <- data.frame(name,state,id,size)

> df
   name  state  id  size
1 Name1 State1 id1  NA    
2 Name2 State2 NA   size2
3 Name3 State3 NA   NA    
4 Name4 State4 id4  size4
5 NA    State5 id5  NA    

列的class在这样的向量中定义:

vars <- c("name","state","id","size")
type <- c("A","A","B","C")

class <- data.frame(vars,type)

> class
   vars type
1  name    A
2 state    A
3    id    B
4  size    C

我想要做的是创建另一个以type命名的列,这样我就可以得到逻辑输出值:如果同一个type中至少有一个不是NA,它应该返回在他们里面是真的,就像这样:

   name  state  id  size  A     B      C
 1 Name1 State1 id1 NA    TRUE  TRUE   FALSE
 2 Name2 State2 NA  size2 TRUE  FALSE  TRUE
 3 Name3 State3 NA  NA    TRUE  FALSE  FALSE
 4 Name4 State4 id4 size4 TRUE  TRUE   TRUE
 5 NA    State5 id5 NA    TRUE  TRUE   FALSE

我如何处理它以获得所需的输出?

1 个答案:

答案 0 :(得分:1)

我们可以通过'class'数据集中的'type'split'vars'列(class是一个函数名称),遍历list,子集'来自'vars'的df'列,通过检查它将其转换为逻辑matrix不等于空白,通过将其与rowSums进行比较来获取vector并创建逻辑cbind(df, sapply(split(as.character(class$vars), class$type), function(x) rowSums(df[x] != "") == ncol(df[x]))) # name state id size A B C #1 Name1 State1 id1 TRUE TRUE FALSE #2 Name2 State2 size2 TRUE FALSE TRUE #3 Name3 State3 TRUE FALSE FALSE #4 Name4 State4 id4 size4 TRUE TRUE TRUE #5 State5 id5 FALSE TRUE FALSE 数据集的列数,即我们正在检查TRUE值的数量是否等于列数

split

不使用library(tidyverse) class %>% pull(type) %>% unique %>% map(~ class %>% filter(type == .x) %>% pull(vars) %>% as.character %>% select(df, .) %>% `!=`("") %>% as_tibble %>% reduce(`&`)) %>% bind_cols(df, .) 的另一个选项是循环遍历'class'中'type'列的'unique`元素,然后进行子集化

NA

更新

根据OP的帖子中包含df[x] != ""元素的更新数据集,我们将!is.na(df[x])替换为cbind(df, sapply(split(as.character(class$vars), class$type), function(x) rowSums(!is.na(df[x])) >0)) # name state id size A B C #1 Name1 State1 id1 <NA> TRUE TRUE FALSE #2 Name2 State2 <NA> size2 TRUE FALSE TRUE #3 Name3 State3 <NA> <NA> TRUE FALSE FALSE #4 Name4 State4 id4 size4 TRUE TRUE TRUE #5 <NA> State5 id5 <NA> TRUE TRUE FALSE

Eigen::RowVectorXd sdf_grad = Eigen::RowVectorXd::Zero(24);