R 根据'在新列中添加逻辑值;NA';价值观

R 根据'在新列中添加逻辑值;NA';价值观,r,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) 列的类定义在如下向量中: vars <- c("name","state","id","size") t

假设我有以下数据:

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)
列的
定义在如下向量中:

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
   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

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

我们可以
在“类”数据集中按“类型”拆分“vars”列(
class
是一个函数名),在
列表中循环,从“vars”中子集“df”列,通过检查是否不等于空白,将其转换为逻辑
矩阵
,获取
行和
,并通过将其与数据集的列数进行比较,创建逻辑
向量
,即,我们检查真值的数量是否等于列数

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

另一个不使用
split
的选项是循环“class”中“type”列的“unique”元素,然后进行子集设置

library(tidyverse)
class %>%
    pull(type) %>%
    unique %>% 
    map(~ class %>%
              filter(type == .x) %>% 
              pull(vars) %>% 
              as.character %>% 
              select(df, .) %>%
               `!=`("") %>%
              as_tibble %>%
              reduce(`&`)) %>%
    bind_cols(df, .) 
更新 基于OP文章中更新的数据集,使用
NA
元素,我们替换
df[x]!=“
!”!is.na(df[x])

cbind(df,sapply(拆分)(如.character(class$vars),class$type),
函数(x)行和(!is.na(df[x])>0))
#名称状态id大小A B C
#1名称1状态1 id1 TRUE FALSE
#2名称2状态2大小2 TRUE FALSE TRUE
#3姓名3状态3真假假假
#4名称4状态4 id4大小4 TRUE
#5状态5 id5真-真-假

@LuccaRamalho请检查您的输入数据集。您的值与expected@LuccaRamalho修正了issue@LuccaRamalho这正是代码自动执行的部分,只是你必须根据“class”的值进行拆分。你是我的英雄!非常感谢您的帮助和耐心@谢谢你,我更新了我之前的评论。如果不更新您的帖子和预期输出,就很难评论您真正想要的内容,例如,在您的“大小”列输入中,第一次观察是
,最后一次是
library(tidyverse)
class %>%
    pull(type) %>%
    unique %>% 
    map(~ class %>%
              filter(type == .x) %>% 
              pull(vars) %>% 
              as.character %>% 
              select(df, .) %>%
               `!=`("") %>%
              as_tibble %>%
              reduce(`&`)) %>%
    bind_cols(df, .) 
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