2017-11-10 17 views
0

長さ15000、metおよびという名前の数値ベクトルが2つあります。類似の名前が存在します。例えば:条件ベースのサブセットR

head(met) 
    ALB IGKJ1  IGKC IGKJ4 IGKJ2 IGHG2 
25.75415 20.55957 18.28749 17.87589 17.22944 16.60235 
head(nor) 
    SAA1  CRP RNVU  SNORD68 CYP1A2  IGKJ1 
25.74548 24.05058 16.72566 15.05746 13.75348 10.74111 

私は、各met値は、対応するnor値より1.5*nor大きければ、それはnorに存在し、線量場合metをサブセットしたいです。

上記の例では、私はIGKJ1が唯一の出力となることを比較しています。

これはどのようにコードする必要がありますか?

+2

再現可能な例を示してください。 'dput(head(met))'と 'dput(head(nor)) 'の結果です。あなたの質問は、誰かが答えられる可能性が高くなります。 – Ape

答えて

1
library(dplyr) 

# get named vectors 
met = c(25.75415, 20.55957, 18.28749, 17.87589, 17.22944, 16.60235) 
names(met) = c("ALB", "IGKJ1", "IGKC", "IGKJ4", "IGKJ2", "IGHG2") 

nor = c(25.74548, 24.05058, 16.72566, 15.05746, 13.75348, 10.74111) 
names(nor) = c("SAA1", "CRP", "RNVU", "SNORD68", "CYP1A2", "IGKJ1") 

# transform them as data frames 
dt_met = data.frame(v_met = met) 
dt_met$names = row.names(dt_met) 

dt_nor = data.frame(v_nor = nor) 
dt_nor$names = row.names(dt_nor) 
新しいデータフレームの行として名前と値の両方を維持する

最初のオプション:あなたの基準に合格してから元のベクトルのサブセットためにそれらを使用する名前だけを維持する

# keep names as a dataset 
dt_met %>% 
    inner_join(dt_nor, by="names") %>% # keep names that exist in both datsets 
    filter(v_met > 1.5*v_nor) %>%  # keep rows where the condition is satisfied 
    select(names, everything())   # order columns 

# names v_met v_nor 
# 1 IGKJ1 20.55957 10.74111 

番目のオプション:

# save names as a vector 
dt_met %>% 
    inner_join(dt_nor, by="names") %>% 
    filter(v_met > 1.5*v_nor) %>% 
    pull(names) -> new_names 

# subset met using those names 
met[names(met) %in% new_names] 

# IGKJ1 
# 20.55957 
+0

恐ろしい!それはうまく動作します!私自身の情報のために、それを 'ifelse' @AntoniosKにコード化することが可能でしたか? – symo

+0

ifelseを使う方法があると確信しています。なぜなら、条件を適用する必要があるからですが、ここで良いアプリケーションであるかどうかはわかりません。フィルタも同じことをしています。 – AntoniosK