Saya memiliki kumpulan data genetik ID posisi genom di mana 2 ID dapat memiliki nilai bersama dalam satu kolom. Saya ingin membuat kolom lain yang mengidentifikasi mereka yang memiliki informasi bersama.

Misalnya data saya terlihat seperti:

CP     Shared_CP
1:10   1:10, 1:11, 1:12
1:20   1:56
1:11   1:11, 1:10, 1:12
1:22   1:21, 1:30
1:30   1:30, 1:21

Saya ingin menandai baris dengan informasi Shared_CP yang cocok dan secara unik mengidentifikasi setiap pengelompokan, menghasilkan:

CP     Shared_CP          matches
1:10   1:10, 1:11, 1:12      1
1:20   1:56                  NA
1:11   1:11, 1:10, 1:12      1
1:22   1:21, 1:30            2
1:30   1:30, 1:21            2

Saya melihat ada pertanyaan serupa untuk membuat kolom baru berdasarkan info kolom lain, tetapi saya belum menemukan cara untuk membuatnya berfungsi untuk masalah saya, saat ini saya mencoba menandai baris dengan info bersama berdasarkan jika mereka memiliki koma di kolom Shared_CP, tetapi saya tidak tahu bagaimana memberikan kecocokan individu pengidentifikasi unik untuk disimpan - bantuan apa pun akan dihargai.

Contoh data masukan:

structure(list(CP = c("1:10", "1:20", "1:11", "1:22", "1:30"
), Shared_CP = c("1:10, 1:11, 1:12", "1:56", "1:11, 1:10, 1:12", "1:21, 1:30", 
"1:30, 1:21")), row.names = c(NA, -5L), class = c("data.table", 
"data.frame"))

Sunting: untuk detail tambahan, dataset saya yang sebenarnya dapat memiliki beberapa ID Shared_CP, bukan hanya 2. Bisa juga ada beberapa input Shared_CP dalam satu baris di mana CP tidak sama/disertakan di kolom Shared_CPs, saya telah mengubah contoh menjadi mencerminkan ini.

2
DN1 1 Juli 2020, 16:04

1 menjawab

Titik sentral di sini tampaknya 1:10,1:11 dan 1:11,1:10 sebenarnya adalah grup yang sama, bukan? Jadi, inilah pendekatan saya:

library(tidyverse)

# we take the dataframe
df %>%
    # and remove the whitespaces from Shared_CP
    mutate(Shared_CP = gsub(" ", "", Shared_CP)) %>%
    # then split Shared_CP into multiple rows considering "," as a separator
    separate_rows(Shared_CP, sep = ",") %>%
    # ...create a column to check if CP is equal to Shared_CP
    mutate(contained = CP == Shared_CP) %>%
    # sort everything+
    arrange(CP, Shared_CP) %>%
    # and squish it together again, so we have same strings from same Shared_CP groups
    # (and a boolean to indicate whether CP is in that group)
    group_by(CP) %>%
    summarise(Shared_CP = paste(Shared_CP, collapse = ",")
              , contained = any(contained)) %>%
    ungroup() %>%
    # now we provide a unique ID to the Shared_CP groups
    mutate(matches = dense_rank(Shared_CP)) %>%
    # and set the non-matching ones NA
    mutate(matches = if_else(contained, matches, NA_integer_)) %>%
    # finally we remove the contained column
    select(-contained)

Keluaran:

  CP    Shared_CP matches
  <chr> <chr>       <int>
1 1:10  1:10,1:11       1
2 1:11  1:10,1:11       1
3 1:20  1:56           NA
4 1:21  1:21,1:30       2
5 1:30  1:21,1:30       2
1
Georgery 1 Juli 2020, 13:43