繁体   English   中英

将R中的二进制变量合并到一个新变量

[英]Merging binary variables in R to a new variable

我有三个分类变量,即中风、MI 和 BP,其值为 0 = 是和 1 = 否。我想将它们合并以从这三个变量中创建一个新变量“cvd”,其中每行 0 得到 0 值在新心血管变量。 例如:

Stroke  MI  BP  CVD
0       1    1   0
1       1    1   1
1       1    0   0

我尝试了以下代码,但这不是我想要的

transform(koratest, cvd=paste(stroke,MI, BP))

有人可以帮忙看看这可能是什么脚本吗?

最好的,

感谢您提供所有解决方案。 如果要合并的任何值中存在缺失值怎么办。 我希望将缺失值标记为 1,但如果缺失值为 0,我希望 cvd 变量的值为 1。例如:

 Stroke  MI  BP  CVD
0       1    1   0
1       NA   NA  1
0       NA   1   0

我怎样才能实现这样的输出?

尝试,

(rowSums(df) == ncol(df)) * 1
#[1] 0 1 0

另一种方式:

library(dplyr)

df <- data.frame(Stroke = c(0,1,1),
                   MI = c(1,1,1),
                   BP = c(1,1,0))

df %>% 
  rowwise() %>% 
  mutate(
    CVD = min(Stroke, MI, BP) 
  ) %>% 
  ungroup()

#> # A tibble: 3 × 4
#>   Stroke    MI    BP   CVD
#>    <dbl> <dbl> <dbl> <dbl>
#> 1      0     1     1     0
#> 2      1     1     1     1
#> 3      1     1     0     0

reprex 包于 2022-07-11 创建 (v2.0.1)

尝试使用dplyr rowwise函数

library(dplyr)

df |> rowwise() |> mutate(CVD = if(all(c_across() == 1)) 1 else 0) |> ungroup()
  • 输出
# A tibble: 3 × 4
# Rowwise: 
  Stroke    MI    BP   CVD
   <int> <int> <int> <dbl>
1      0     1     1     0
2      1     1     1     1
3      1     1     0     0

不知道你如何安排你的变量。 如果它们是分离的向量,这应该有效:

Stroke = c(0,1,1)
MI = c(1,1,1)
BP = c(1,1,0)
CVD = as.numeric(Stroke & MI & BP)

如果是data.frame

df$CVD = with(df, as.numeric(Stroke & MI & BP)

或者其他人提到的解决方案。

也许是这样:

library(tidyverse)

Data <- data.frame(Stroke = c(0,1,1),
                   MI = c(1,1,1),
                   BP = c(1,1,0))

Data <- Data %>% 
  mutate(CVD = if_else(Stroke == 1 &MI == 1 & BP == 1, 1, 0))

base R选项:

df$CVD <- apply(df,2, function(x) !any(0 %in% x)) + 0
df

输出:

  Stroke MI BP CVD
1      0  1  1   0
2      1  1  1   1
3      1  1  0   0

cbind rowSumsdat是一个数据框并创建它。

cbind(dat, CVD=+(rowSums(dat[c('Stroke', 'MI', 'BP')]) == 3))
#   Stroke MI BP CVD
# 1      0  1  1   0
# 2      1  1  1   1
# 3      1  1  0   0

如果您只有这些列,则可以简化为:

cbind(dat, CVD=+(rowSums(dat) == 3))

数据:

dat <- structure(list(Stroke = c(0L, 1L, 1L), MI = c(1L, 1L, 1L), BP = c(1L, 
1L, 0L)), class = "data.frame", row.names = c(NA, -3L))

解决您的问题的另一种方法:

df$CVD = with(df, pmin(Stroke, MI, BP)) 

  Stroke MI BP CVD
1      0  1  1   0
2      1  1  1   1
3      1  1  0   0

# or
library(data.table)

setDT(df)[, CVD := pmin(Stroke, MI, BP)]

# or
library(dplyr)

df = df %>% 
  mutate(CVD = pmin(Stroke, MI, BP))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM