基于R中同一 Dataframe 中多个列的非数值变量创建新列

nlejzf6q  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(102)

我有一个很大的df,我已经简化了,我想创建两个新的列K_status和S_status,基于另一列中的变量,我正在努力如何最好地为此编码。

A <- c("K", "K", "K", "S", "S", "S", "NA")
B <- c("NA", "AA", "AC", "NA", "AA", "AB", "LD")
C <- c("TT", "YY", "YY", "TT", "YY", "Y", "TT")
df <- data.frame(A, B, C)

要生成用于df的K_status和S_status附加列,我当前的代码是:

df <- df %>%
mutate(K_status = case_when(all("K", "AA", "YY") %in% df) ~ "Mut",
TRUE ~ "WT")) %>%
mutate(S_status = case_when(all("S", "AB", "Y") %in% df) ~ "Mut",
TRUE ~ "WT"))

这段代码不起作用,因为我想要的新df应该如下所示

A <- c("K", "K", "K", "S", "S", "S", "NA")
B <- c("NA", "AA", "AC", "NA", "AA", "AB", "LD")
C <- c("TT", "YY", "YY", "TT", "YY", "Y", "TT")
K_status <- c("WT", "Mut", "WT", "WT", "WT", "WT", "WT")
S_status <- c("WT", "WT", "WT", "WT", "WT", "Mut", "WT")
df <- data.frame(A, B, C, K_status, S_status)

在编写这段代码以生成K_status和S_status时,我们将非常感谢任何帮助。谢谢。

p1tboqfb

p1tboqfb1#

我们可以使用base R-使用rowSums创建逻辑向量,然后根据它进行赋值,这样效率会更高

i1 <- rowSums(df == c("K", "AA", "YY")[col(df)]) == 3
 i2 <- rowSums(df == c("S", "AB", "Y")[col(df)]) == 3
 df$K_status <- "WT"
 df$K_status[i1] <- "Mut"
  df$S_status <- "WT"
 df$S_status[i2] <- "Mut"
  • 输出
> df
   A  B  C K_status S_status
1  K NA TT       WT       WT
2  K AA YY      Mut       WT
3  K AC YY       WT       WT
4  S NA TT       WT       WT
5  S AA YY       WT       WT
6  S AB  Y       WT      Mut
7 NA LD TT       WT       WT

或者以矢量化的方式使用tidyverse,以便高效执行代码-只需创建一个键/值数据集或一个名为list的,然后循环if_all中的列,从keydat数据集中提取相应的值,比较并使用case_when创建新列

library(dplyr)
keydat <- tibble(A = c("K", "S"), B = c("AA", "AB"), C = c("YY", "Y"))

df %>%
   mutate(K_status = case_when(if_all(everything(),
    ~ .x == keydat[[cur_column()]][1]) ~ "Mut", TRUE ~ "WT"), 
   S_status = case_when(if_all(A:C, ~
    .x == keydat[[cur_column()]][2]) ~ "Mut", TRUE ~ "WT"))
  • 输出
A  B  C K_status S_status
1  K NA TT       WT       WT
2  K AA YY      Mut       WT
3  K AC YY       WT       WT
4  S NA TT       WT       WT
5  S AA YY       WT       WT
6  S AB  Y       WT      Mut
7 NA LD TT       WT       WT
omhiaaxx

omhiaaxx2#

我们可以使用类似的代码后纠正几个不一致:

  • 在比较x %in% z时包含rowwise,其中z按行使用
  • %in% df应替换为对 Dataframe A:C列的正确引用,即c_across
  • 使用all(c(...) %in% x)代替all(...) %in% x
df %>%
    rowwise() %>%
    mutate(K_status = case_when(all(c("K", "AA", "YY") %in% c_across(A:C)) ~ "Mut",
           TRUE ~ "WT")) %>%
    mutate(S_status = case_when(all(c("S", "AB", "Y") %in% c_across(A:C)) ~ "Mut",
           TRUE ~ "WT")) %>%
    ungroup()

# A tibble: 7 × 5
  A     B     C     K_status S_status
  <chr> <chr> <chr> <chr>    <chr>   
1 K     NA    TT    WT       WT      
2 K     AA    YY    Mut      WT      
3 K     AC    YY    WT       WT      
4 S     NA    TT    WT       WT      
5 S     AA    YY    WT       WT      
6 S     AB    Y     WT       Mut     
7 NA    LD    TT    WT       WT

相关问题