簡體   English   中英

如何使用 dplyr 根據另一列中的值選擇列?

[英]How do I select column based on value in another column with dplyr?

我的數據框如下所示:

  id  A  T C  G ref var
1  1 10 15 7  0   A   C
2  2 11  9 2  3   A   G
3  3  2 31 1 12   T   C

我想創建兩個新列: ref_countvar_count ,它們將具有以下值:

  1. A列的值和C列的值,因為refAvarC

  2. A列的值和G列的值,因為refAvarG

等等

所以我想根據每一行的另一列中的值選擇一列。

謝謝!

我們可以使用pivot_longer重塑為“長”格式, filter行,然后使用pivot_wider將其重塑為“寬”格式

library(dplyr)
library(tidyr)
df1 %>%
   pivot_longer(cols = A:G) %>%
   group_by(id) %>% 
   filter(name == ref|name == var) %>%
   mutate(nm1 = c('ref_count', 'var_count')) %>% 
   ungroup %>% 
   select(id, value, nm1) %>% 
   pivot_wider(names_from = nm1, values_from = value) %>%
   left_join(df1, .)
# A tibble: 3 x 9
#     id     A     T     C     G ref   var   ref_count var_count
#* <int> <dbl> <dbl> <dbl> <dbl> <chr> <chr>     <dbl>     <dbl>
#1     1    10    15     7     0 A     C            10         7
#2     2    11     9     2     3 A     G            11         3
#3     3     2    31     1    12 T     C            31         1

或者在base R中,我們也可以使用向量化的行/列索引

df1$refcount <- as.matrix(df1[2:5])[cbind(seq_len(nrow(df1)), match(df1$ref,  names(df1)[2:5]))]
df1$var_count <- as.matrix(df1[2:5])[cbind(seq_len(nrow(df1)), match(df1$var,  names(df1)[2:5]))]

數據

df1 <- structure(list(id = 1:3, A = c(10, 11, 2), T = c(15, 9, 31), 
    C = c(7, 2, 1), G = c(0, 3, 12), ref = c("A", "A", "T"), 
    var = c("C", "G", "C")), row.names = c(NA, -3L), class = c("tbl_df", 
"tbl", "data.frame"))

以下是一個tidyverse替代方案,無需創建需要過濾的長數據幀。 它本質上使用tidyr::nest()按行嵌套數據框,之后可以為每一行選擇正確的列。

df1 %>% 
    nest(data = -id) %>% 
    mutate(
        data = map(
            data,
            ~mutate(., refcount = .[[ref]], var_count = .[[var]])
        )
    ) %>% 
    unnest(data)
#> # A tibble: 3 × 9
#>      id     A     T     C     G ref   var   refcount var_count
#>   <int> <dbl> <dbl> <dbl> <dbl> <chr> <chr>    <dbl>     <dbl>
#> 1     1    10    15     7     0 A     C           10         7
#> 2     2    11     9     2     3 A     G           11         3
#> 3     3     2    31     1    12 T     C           31         1

這種變體不需要(假定特定於行的) id列,而是直接從refvar的唯一值定義嵌套組:

df1 %>% 
    nest(data = -c(ref, var)) %>% 
    mutate(
        data = pmap(
            list(data, ref, var),
            function(df, ref, var) {
                mutate(df, refcount = df[[ref]], var_count = df[[var]])
            }
        )
    ) %>% 
    unnest(data)

數據由 akrun 指定:

df1 <- structure(list(id = 1:3, A = c(10, 11, 2), T = c(15, 9, 31), 
    C = c(7, 2, 1), G = c(0, 3, 12), ref = c("A", "A", "T"), 
    var = c("C", "G", "C")), row.names = c(NA, -3L), class = c("tbl_df", 
"tbl", "data.frame"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM