首页 文章

使用来自另一个data.frame的索引应用ifelse

提问于
浏览
0

我想使用嵌套的ifelse()语句有条件地将一个数据框中的值替换为另一个数据框中的值 . 但我无法使用apply将其扩展到整个数据框 . 我想尽可能避免循环和非基础包 .

第一个是带有六个obs的数据框 . 10个字符变量:

> snp_test
  L1 L2 L3 L4 L5 L6 L7 L8 L9 L10
1  1  2  -  0  2  0  0  0  0   2
2  1  0  -  0  -  1  0  -  -   2
3  -  -  -  0  -  -  0  -  -   1
4  2  0  0  0  0  -  0  0  0   0
5  2  0  -  0  2  -  0  0  0   1
6  1  0  -  0  0  0  0  0  -   0

第二个包含与每个变量相关的三列数据(字符;每个是由空格分隔的两个字母):

> locus_test
   locus gt0 gt1 gt2
1     L1 G G A A G A
2     L2 T T G G T G
3     L3 A A C C A C
4     L4 T T A A T A
5     L5 G G C C G C
6     L6 C C A A C A
7     L7 T T C C T C
8     L8 A A G G A G
9     L9 A A G G A G
10   L10 G G A A G A

我想用snus_test中的值替换locus_test中的值 . 例如,当L1 == 1时,1将被替换为locus_test $ gt1(“A A”)中的对应值 . 当L1 == 2时,使用gt2列中的值(“G A”) .

我可以分别对每个变量执行此操作:

ifelse(snp_test[,1]==1,locus_test$gt1[locus_test$locus =="L1"],snp_test[,1])

然后我会嵌套ifelse,以便将三个不同的值替换为locus_test中的相应值,例如:

ifelse(ifelse(snp_test[,1]==1,locus_test$gt1[locus_test$locus =="L1"],snp_test[,1])==2,locus_test$gt2[locus_test$locus =="L1"],ifelse(snp_test[,1]==1,locus_test$gt1[locus_test$locus =="L1"],snp_test[,1]))

等等...

但是,当我将其应用于snp_test中的所有变量时,即

apply(snp_test,2,function(x)ifelse(x==1,locus_test$gt1,x))

locus_test $ gt1的前六个值用作替换值,而不是与每列相关的单个值 . 所以我想知道如何添加必要的索引,以便在例如snp_test的L1列中替换的值只能是locus_test中与L1对应的三个变量之一 .

换句话说,我如何指定ifelse的子集部分:

locus_test$gt1[locus_test$locus =="L1"]

申请?

1 回答

  • 0

    这是一种方式

    library(tidyverse)
    left_join(
      snp_test %>% tibble::rownames_to_column() %>% gather(locus, key, -rowname),
      gather(locus_test, key, value, -locus) %>% mutate(key=substr(key,3,3)),
      by = c("locus", "key")
    ) %>% 
      select(-key) %>% 
      mutate(value=if_else(is.na(value),"-",value)) %>%
      spread(locus, value)
    #   rowname L1 L10 L2 L3 L4 L5 L6 L7 L8 L9
    # 1       1 AA  GA TG  - TT GC CC TT AA AA
    # 2       2 AA  GA TT  - TT  - AA TT  -  -
    # 3       3  -  AA  -  - TT  -  - TT  -  -
    # 4       4 GA  GG TT AA TT GG  - TT AA AA
    # 5       5 GA  AA TT  - TT GC  - TT AA AA
    # 6       6 AA  GG TT  - TT GG CC TT AA  -
    

相关问题