Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中带有mutate()和filter()的行逻辑操作_R_Select_Filter_Dplyr_Rowwise - Fatal编程技术网

R中带有mutate()和filter()的行逻辑操作

R中带有mutate()和filter()的行逻辑操作,r,select,filter,dplyr,rowwise,R,Select,Filter,Dplyr,Rowwise,我经常不得不在数据帧中进行变异或选择,条件适用于变量子集,但我不能始终如一地这样做 玩具示例数据框: data<-data.frame(id=c("John", "Jane", "Louis", "Mirian"), a=c(FALSE, FALSE, TRUE, TRUE), b=c(FALSE, NA, TR

我经常不得不在数据帧中进行变异或选择,条件适用于变量子集,但我不能始终如一地这样做

玩具示例数据框:

data<-data.frame(id=c("John", "Jane", "Louis", "Mirian"),
                         a=c(FALSE, FALSE, TRUE, TRUE),
                         b=c(FALSE, NA, TRUE, NA), 
                         c=c(TRUE, FALSE, TRUE, TRUE),
                         num=1:4)
但是,如果不在链式比较中指定所有变量a:c,我就无法做到这一点

我尝试了以下方法,结果不一致。不知道为什么:

data%>%mutate(abc_any=Reduce("|", a:c))

      id     a     b     c num abc_any
1   John FALSE FALSE  TRUE   1    TRUE
2   Jane FALSE    NA FALSE   2    TRUE
3  Louis  TRUE  TRUE  TRUE   3    TRUE
4 Mirian  TRUE    NA  TRUE   4    TRUE
这是可行的,但令人惊讶的是,abc_any被强制为数字:

data%>%rowwise()%>%mutate(abc_any=Reduce("|", a:c))

# A tibble: 4 x 6
# Rowwise: 
  id     a     b     c       num abc_any
  <fct>  <lgl> <lgl> <lgl> <int>   <int>
1 John   FALSE FALSE TRUE      1       1
2 Jane   FALSE NA    FALSE     2       0
3 Louis  TRUE  TRUE  TRUE      3       1
4 Mirian TRUE  NA    TRUE      4       1
操作2:过滤器 -我有时想用类似的条件过滤,但不能:

data%>%filter(a|b|c)
工作正常

这一变化以及若干行%>%减少了。。。和其他失败,并显示各种错误消息:

data%>%rowwise()%>%mutate(abc_any=apply(a:c, 1, any))
data%>%filter(rowwise(Reduce("|", a:c)))
这一条根本没有过滤,抛出的数值表达式有4个元素:只有第一条使用的消息:

data%>%filter(Reduce("|", a:c))
我是否必须创建一个新的“temp”列,并使用上面的mutate,然后使用filter

使用二进制数字变量: -现在,让我们假设这些逻辑变量被强制为数值,数据_2%mutateacrosswhereis.logical,as.numeric:

我尝试使用行和,但也失败了:

data_2%>%rowwise()%>%mutate(abc_any=rowSums(a:c, na.rm = TRUE))

Error: Problem with `mutate()` input `abc_any`.
x 'x' must be an array of at least two dimensions
ℹ Input `abc_any` is `rowSums(a:c, na.rm = TRUE)`.
ℹ The error occured in row 1.
这些错误的可能解决方法是什么?

Reduce应该在列表中-选择a:c列并将Reduce作为数据使用。frame/tibble也是一个列表

或者我们需要过滤

或者另一个选择是如果有

或者从purr中使用reduce

或者使用行和的代码


“我知道,在您的解决方案中,实际上从来都不需要使用rowwise,@akrun。为什么这个数据%>%rowwise%>%mutateabc|u any=Reduce |,a:c起作用,但是没有rowwise的类似尝试却不起作用?它是否与函数的矢量化有关?@GuedesBF with Reduce或if_any/if_all,它正在对每一行进行比较。此外,与c_交叉的rowwise将更少efficient@GuedesBF您的rowwise可以工作,但这里确实不需要它。它不必要地按行分组,因为即使没有Reduce,Reduce也会应用于每一行
data_2%>%rowwise()%>%mutate(abc_any=rowSums(a:c, na.rm = TRUE))

Error: Problem with `mutate()` input `abc_any`.
x 'x' must be an array of at least two dimensions
ℹ Input `abc_any` is `rowSums(a:c, na.rm = TRUE)`.
ℹ The error occured in row 1.
library(dplyr)
data %>% 
     mutate(abc_any = Reduce("|", select(., a:c)))
data %>% 
    filter(Reduce(`|`, select(., a:c)))
data %>%
   filter(if_any(a:c))
#      id     a     b    c num
#1   John FALSE FALSE TRUE   1
#2  Louis  TRUE  TRUE TRUE   3
#3 Mirian  TRUE    NA TRUE   4
library(purrr)
data %>%
      mutate(abc_any = select(., a:c) %>%
        reduce(`|`))
data %>%
   mutate(across(where(is.logical), as.numeric)) %>%
   mutate(abc_any = rowSums(select(., a:c), na.rm = TRUE) > 0)