[英]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.