我正在嘗試創建一個指標“newvar”,以查看三個二進制變數中的至少一個是否具有 1 的值。我希望僅當所有三個變數都丟失而不是至少一個沒有丟失時才丟失該變數. 這些方法正確嗎?
df<- df %>% rowwise() %>% mutate(newvar = sum(var1, var2,var3), na.rm=T)
df$newvar <- as.integer(var1|var2|var3, na.rm=TRUE)
uj5u.com熱心網友回復:
也許這就是你想要的。
df$newvar <- as.numeric( apply( df, 1, function(x){
y <- any( x==1 ) & !anyNA( any( x==1 ) );
if( all( is.na(x) ) ) y[ all(is.na(x)) ] <- NA; y } ) )
df
a b c newvar
1 1 1 1 1
2 0 NA 0 0
3 1 1 NA 1
4 0 0 0 0
5 1 1 1 1
6 1 1 1 1
7 NA NA NA NA
8 0 0 0 0
9 1 0 1 1
10 1 1 0 1
或與 sum
df$newvar <- as.numeric( apply( df, 1, function(x){
y <- sum(x, na.rm=T) > 0;
if(all(is.na(x))) y[ all(is.na(x)) ] <- NA; y } ) )
df
a b c newvar
1 1 1 1 1
2 0 NA 0 0
3 1 1 NA 1
4 0 0 0 0
5 1 1 1 1
6 1 1 1 1
7 NA NA NA NA
8 0 0 0 0
9 1 0 1 1
10 1 1 0 1
資料
df <- structure(list(a = c(1L, 0L, 1L, 0L, 1L, 1L, NA, 0L, 1L, 1L),
b = c(1L, NA, 1L, 0L, 1L, 1L, NA, 0L, 0L, 1L), c = c(1L,
0L, NA, 0L, 1L, 1L, NA, 0L, 1L, 0L)), class = "data.frame", row.names = c(NA,
-10L))
uj5u.com熱心網友回復:
我們可以dplyr::rowwise結合使用dplyr::c_across來減少代碼,尤其是當變數超過 3 個時。
library(tidyverse)
set.seed(4)
df <- rerun(3, sample(c(0, 1, NA), 10, replace = TRUE)) %>% as_tibble(.name_repair = "unique")
#> New names:
#> * `` -> ...1
#> * `` -> ...2
#> * `` -> ...3
df %>%
rowwise() %>%
mutate(newvar = c_across(starts_with(".")) %>%
{
case_when(
all(is.na(.)) ~ NA,
any(. == 1) ~ TRUE,
any(. != 1) & any(. == 0) ~ FALSE
)
} %>%
as.numeric())
#> # A tibble: 10 × 4
#> # Rowwise:
#> ...1 ...2 ...3 newvar
#> <dbl> <dbl> <dbl> <dbl>
#> 1 NA 1 0 1
#> 2 NA 1 1 1
#> 3 NA 1 NA 1
#> 4 NA 0 0 0
#> 5 NA NA NA NA
#> 6 1 NA 0 1
#> 7 0 NA 1 1
#> 8 1 NA 0 1
#> 9 NA 0 0 0
#> 10 1 0 1 1
由reprex 包(v2.0.1)于 2021 年 12 月 4 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/372998.html
標籤:r
上一篇:R中的data_GAN邏輯回歸
