1

0.955以上の類似性スコアを持つすべての行を連結したいと思います。および列は、それぞれ上下の行との類似性スコアを表しますAboBel次の入力では、4 つのゲノム セグメント ( ) に連結されたdf10 個のゲノム プローブ (NAME列) がありますdfout

df <- " NAME Abo  Bel Chr GD Position
 BovineHD0100009217 NA 1.0000000   1  0  31691781
 BovineHD0100009218 1.0000000 0.6185430   1  0  31695808
 BovineHD0100019600 0.6185430 0.9973510   1  0  69211537
 BovineHD0100019601 0.9973510 1.0000000   1  0  69213650
 BovineHD0100019602 1.0000000 1.0000000   1  0  69214650
 BovineHD0100019603 1.0000000 0.6600000   1  0  69217942
 BovineHD0100047112 0.6600000 1.0000000   1  0  93797691
 BovineHD0100026604 1.0000000 1.0000000   1  0  93815774
 BovineHD0100026605 1.0000000 0.4649007   1  0  93819471
 BovineHD0100029861 0.4649007 NA   1  0 105042452"
df <- read.table(text=df, header=T)

私の期待される出力dfout:

dfout <- "Chr start end startp endp nprob 
           1  31691781 31695808 BovineHD0100009217 BovineHD0100009218 2
           1  69211537 69217942 BovineHD0100019600 BovineHD0100019603 4
           1  93797691 93819471 BovineHD0100047112 BovineHD0100026605 3
           1  105042452 105042452 BovineHD0100029861 BovineHD0100029861 1"
dfout <- read.table(text=dfout, header=T)

何か案は?

4

3 に答える 3

2

dplyrバージョンはこちら。最初にグループを定義する必要があります。これはmutateビットが行っていることであり、次にsummariseグループ内の単純な機能です。

library(dplyr)

df %>% 
  mutate(
   Abo955=ifelse(Abo<0.955,NA,Abo),
   myGroup=cumsum(is.na(Abo955)*1)) %>%
  group_by(myGroup) %>% 
  summarise(
    Chr=min(Chr),
    start=min(Position),
    end=max(Position),
    startp=first(NAME),
    lastp=last(NAME),
    nprob=n()) %>% 
  select(-myGroup)
于 2015-05-18T20:50:23.723 に答える
1

このソリューションは純粋に論理ベクトルに基づいており、提供されている例で機能します。

Molx が言ったように、stringsAsFactors=F を追加しましょう

df <- read.table(text=df, header=T, stringAsFactors = F)

論理評価が機能するように、NA を 0 に変更しましょう

df(is.na(df)) <- 0

ここで、連結される連続する行について、論理評価を使用して「開始」行と「終了」行を見つけます

starts <- df$Bel >= 0.955 &  df$Abo < 0.955
ends <- df$Bel < 0.955 &  df$Abo >= 0.955

これにより、連結する必要がある行を連結する data.frame をすでに構築できます。

concatenated <- data.frame(Chr = df[starts, "Chr"], 
                            start = df[starts, "Position"], 
                            end = df[ends, "Position"],
                            startp = df[starts, "NAME"],
                            endp = df[ends, "NAME"],
                            nprob = c( diff (which(starts))[1]  ,diff (which(ends)))
                            )

また、連結されていない行、つまり、上下の行のどちらでも目的の類似性スコアを持たない行で data.frame を構築しましょう。

notConcatenate <- df$Abo < 0.955 & df$Bel < 0.955

non_concatenated <- data.frame(Chr = df[notConcatenate, "Chr"], 
                            start = df[notConcatenate, "Position"], 
                            end = df[notConcatenate, "Position"],
                            startp = df[notConcatenate, "NAME"],
                            endp = df[notConcatenate, "NAME"],
                            nprob = 1
                            )

最後に、2 つの data.frames をバインドします

dfout <- rbind(concataneted,non_concatenated)

その結果

> dfout
  Chr     start       end             startp               endp nprob
1   1  31691781  31695808 BovineHD0100009217 BovineHD0100009218     2
2   1  69211537  69217942 BovineHD0100019600 BovineHD0100019603     4
3   1  93797691  93819471 BovineHD0100047112 BovineHD0100026605     3
4   1 105042452 105042452 BovineHD0100029861 BovineHD0100029861     1

注: このコードは、相関するプローブが同じ染色体内にあることを前提としています

乾杯!

于 2015-05-20T23:57:23.103 に答える