【问题标题】:How to check rowwise condition for a data frame (with dplyr, purrr, etc)?如何检查数据框的逐行条件(使用 dplyr、purrr 等)?
【发布时间】:2019-09-09 13:07:28
【问题描述】:

我有一个数据框,我想为每一行生成一个变量,告诉它某个变量子集的所有元素是否等于给定元素。

在下一个示例中,对于yz 等于1 的行,new 变量应为TRUE,否则FALSE。但结果全是FALSE。我对代码做了很多修改,尝试使用purrr::pmap.dbldo.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

据了解,是一个简单的例子,但是我的变量比较多,我得用selectall之类的,具体元素不是1

谢谢!

【问题讨论】:

  • 是的,但是是否可以使条件独立于变量的数量?为什么all 不起作用?谢谢!
  • 我认为这应该类似于rowSums(test[-1] == 1) == ncol(test[-1]),因为您需要先将所有列与 1 进行比较。尽管最好预先定义要使用的列,然后创建一些仅使用这些列的强大函数,例如 f &lt;- function(data, cols, value) rowSums(data[cols] == value) == length(cols)

标签: r dataframe dplyr purrr


【解决方案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的输出不是数据框而是矩阵...

谢谢!

【讨论】:

    【解决方案2】:

    试试:

    test %>% mutate(new = y&z)
    

    适用于 0/1 以外的其他值

    【讨论】:

      【解决方案3】:

      我在您作为示例提供的数据框中添加了其他功能。我相信您要检查或确保的唯一条件是 yz 同时等于 1 &amp;

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

      【讨论】:

      • test %&gt;% mutate(new = y == 1 &amp; z == 1)
      【解决方案4】:

      data.table 解决方案:

      setDT(test)[y == 1 & z == 1, new := TRUE]
      

      当条件满足时给你TRUE,否则给你NA。如果你需要FALSE,那么:

      setDT(test)[, new := FALSE]
      test[y ==1 & z ==1, new := TRUE]
      

      【讨论】:

        猜你喜欢
        • 2022-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 2016-11-19
        相关资源
        最近更新 更多