Как выбрать столбец на основе значения в другом столбце с dplyr? - PullRequest
2 голосов
/ 22 февраля 2020

Мой фрейм данных выглядит следующим образом:

  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_count и var_count, которые будут иметь следующие значения:

  1. Значение из столбца A и значение из столбца C, поскольку ref равно A, а var равно C

  2. Значение из A столбец и значение из G столбца, поскольку ref равно A, а var равно G

et c.

Итак Я хотел бы выбрать столбец на основе значения в другом столбце для каждой строки.

Спасибо!

1 Ответ

2 голосов
/ 22 февраля 2020

Мы можем использовать 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]))]

data

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...