[英]How to check rowwise condition for a data frame (with dplyr, purrr, etc)?
我有一个数据框,我想为每一行生成一个变量,该变量告诉某个变量子集的所有元素是否等于给定元素。
在下一个示例中,对于y
和z
等于1
的行, new
变量应为TRUE
,否则为FALSE
。 但结果全是FALSE
。 我对代码进行了很多更改,并尝试使用purrr::pmap.dbl
和do.call
,但没有成功。
library(dplyr)
test <- data.frame(x=c(0,1,1), y = c(1,1,1), z = c(1,1,0))
test %>% mutate(new = all(select(.,-x) == 1))
x y z new
1 0 1 1 FALSE
2 1 1 1 FALSE
3 1 1 0 FALSE
据了解,这是一个简单的例子,但是我有更多的变量,我必须使用select
和all
或类似的东西,并且具体元素不是1
。
谢谢!
更新
目前我会这样做:
library(tidyverse)
all_cols <- function(df) reduce(df, `&`)
test %>%
mutate(new = all_cols(across(-x,~`==`(.,1))))
老的
我想我已经找到了解决问题的方法:
test %>%
mutate(new =
purrr::pmap(mutate_at(., vars(-x), `==`, 1) %>% select(-x), all) %>%
unlist())
我在问题中测试的问题似乎是select(.,-x) == 1
的输出不是数据框而是矩阵...
谢谢!
尝试 :
test %>% mutate(new = y&z)
适用于 0/1 以外的其他值
我在您作为示例提供的数据框中添加了其他功能。 我相信您要检查或确保的唯一条件是y
和z
同时等于1
&
。
test %>% mutate(new = ifelse((y ==1 & z==1),TRUE,FALSE))
structure(list(x = c(0, 1, 1, 2), y = c(1, 1, 1, 2), z = c(1,
1, 0, 2), d = c(0, 0, 0, 2), e = c(1, 2, 2, 2)), class = "data.frame", row.names = c(NA,
-4L))
一个 data.table 解决方案:
setDT(test)[y == 1 & z == 1, new := TRUE]
当条件满足时会给你TRUE
,否则会给你NA
。 如果您需要FALSE
,则:
setDT(test)[, new := FALSE]
test[y ==1 & z ==1, new := TRUE]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.