假设我有这些数据:
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
我如何处理它以获得所需的输出?
答案 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);