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