我想使用嵌套的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 回答
这是一种方式