根据 R 中的条件创建一个新变量

Create a new variable based in conditions in R

我正在尝试在数据库中创建(改变)一个新变量,但我遇到了一些问题。我的想法是创建一个变量,该变量根据先前变量的值复制数据库中另一个变量的结果。

举个例子:

Database
var1var2var3    var4
1   45  AH67    A456
1   78  GH98    D788
5   46  GD94    M747
5   98  GF21    G589
10  47  GD09    I989
10  54  KG32    U456
15  48  FS89    C191
15  66  GF23    Y198

我的想法是:

预期结果:

var1var2var3    var4    new
1   45  AH67    A456    45
1   78  GH98    D788    78
5   46  GD94    M747    GD94
5   98  GF21    G589    GD94
10  47  GD09    I989    na
10  54  KG32    U456    na
15  48  FS89    C191    C191
15  66  GF23    Y198    Y198

我试过了,但没成功。

data<-mutate(data,
             ifelse(var1==1){New=var2},
             ifelse(var1==5){New=var3},
             ifelse(var1==10){New=NA},
             ifelse(var1==15){New=var4})

提前致谢,

mutate 的语法是 mutate(.data, new_col = something)。此外,由于您有多个基于 var1 的条件,因此您需要有一个嵌套的 ifelse。因此,正确的做法是:

library(dplyr)

df %>% mutate(new = ifelse(var1 == 1, 
                           var2, 
                           ifelse(var1 == 5, 
                                  var3, 
                                  ifelse(var1 == 10, 
                                         NA, 
                                         ifelse(var1 == 15, 
                                                var4, 
                                                NA)))))

或者使用dplyr::case_when,语法更清晰:

df %>% mutate(new = case_when(var1 == 1 ~ as.character(var2),
                              var1 == 5 ~ var3,
                              var1 == 15 ~ var4))

输出

以上两种方法的输出是一样的

  var1 var2 var3 var4  new
1    1   45 AH67 A456   45
2    1   78 GH98 D788   78
3    5   46 GD94 M747 GD94
4    5   98 GF21 G589 GF21
5   10   47 GD09 I989 <NA>
6   10   54 KG32 U456 <NA>
7   15   48 FS89 C191 C191
8   15   66 GF23 Y198 Y198
library(dplyr)
data %>%  
  mutate(new = case_when(var1 == 1 ~ as.character(var2),
                         var1 == 5 ~ var3,
                         var1 == 10 ~ as.character(NA),
                         var1 == 15 ~ var4))

输出

# A tibble: 8 x 5
   var1  var2 var3  var4  new  
  <int> <int> <chr> <chr> <chr>
1     1    45 AH67  A456  45   
2     1    78 GH98  D788  78   
3     5    46 GD94  M747  GD94 
4     5    98 GF21  G589  GF21 
5    10    47 GD09  I989  NA   
6    10    54 KG32  U456  NA   
7    15    48 FS89  C191  C191 
8    15    66 GF23  Y198  Y198