簡體   English   中英

使用 dplyr 跨多列的二元響應列條件

[英]Binary response column conditional across multiple columns with dplyr

我的玩具數據框

A = c(4, 1, 0) 
B = c(0, 1, 0)
C = c(3, 0, 1)
D = c(2, 4, 1)
df = data.frame(A, B, C, D)

我想返回一個看起來像這樣的數據框,對於每一行,如果任何列 A 到 D 的值為 3 或更大,則列“E”的值為“1”,否則為“0”:

  A B C D E
1 4 0 3 2 1
2 1 1 0 4 1
3 0 0 1 1 0

如果從 A 到 D 的任何列的值大於或等於 3,則嘗試創建一個名為“E”的新列,其值為“1”,否則該值應為“0”。

library(tidyverse)
 df2  <- df %>% 
      mutate(E = ifelse(select(any_of(vars) >= 3, 1, 0)))

那沒用……我也用 case_when 嘗試了一些東西

df2  <- df %>% 
      mutate(E = any_vars(case_when ((.) >= 3 ~ 1)) %>% 
      mutate(E = any_vars(case_when ((.) <3 ~ 0))

這也不起作用。

我認為這可能是一個可能的解決方案:

mutate(df, E = ifelse(pmax(A,B,C,D)>=3,1,0))

用試試這個dplyr使用c_across()

library(dplyr)
#Code
newdf <- df %>% rowwise() %>% mutate(E=as.numeric(length(which((c_across(A:D))>=3))>=1))

輸出:

# A tibble: 3 x 5
# Rowwise: 
      A     B     C     D     E
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     4     0     3     2     1
2     1     1     0     4     1
3     0     0     1     1     0

或者在base R使用apply()

#Base R
df$E <- apply(df,1,function(x) as.numeric(length(which(x>=3))>=1))

輸出:

  A B C D E
1 4 0 3 2 1
2 1 1 0 4 1
3 0 0 1 1 0

這是否有效:

> library(dplyr)
> df %>% rowwise() %>% mutate(E = case_when(any(A:D >=3) ~ 1, TRUE ~ 0))
# A tibble: 3 x 5
# Rowwise: 
      A     B     C     D     E
  <dbl> <dbl> <dbl> <dbl> <dbl>
1     4     0     3     2     1
2     1     1     0     4     1
3     0     0     1     1     0
> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM