为了账号安全,请及时绑定邮箱和手机立即绑定

字典样式替换多个项目

字典样式替换多个项目

扬帆大鱼 2019-07-30 16:30:46
字典样式替换多个项目我有一个大型的data.frame字符数据,我想根据其他语言中通常称为字典的内容进行转换。目前我正在这样做:foo <- data.frame(snp1 = c("AA", "AG", "AA", "AA"), snp2 = c("AA", "AT", "AG", "AA"), snp3 = c(NA, "GG", "GG", "GC"), stringsAsFactors=FALSE)foo <- replace(foo, foo == "AA", "0101")foo <- replace(foo, foo == "AC", "0102")foo <- replace(foo, foo == "AG", "0103")这样可以正常工作,但是replace每次我想要替换data.frame中的一个项目时,重复该语句显然不是很漂亮并且看起来很愚蠢。有没有更好的方法来实现这一点,因为我有一个大约25个键/值对的字典?
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

map = setNames(c("0101", "0102", "0103"), c("AA", "AC", "AG"))foo[] <- map[unlist(foo)]

假设map涵盖了所有案例foo。如果foo是一个矩阵(字符()),这会感觉不像'黑客',在空间和时间上都更有效率,然后

matrix(map[foo], nrow=nrow(foo), dimnames=dimnames(foo))

当存在数百万个SNP和数千个样本时,矩阵和数据帧变体都与R 2的矢量大小限制相差2 ^ 31-1。


查看完整回答
反对 回复 2019-07-30
?
慕斯709654

TA贡献1840条经验 获得超5个赞

如果您愿意使用包,那么它plyr是一个非常受欢迎的包,并且具有这个方便的mapvalues()函数,可以满足您的需求:

foo <- mapvalues(foo, from=c("AA", "AC", "AG"), to=c("0101", "0102", "0103"))

请注意,它适用于所有类型的数据类型,而不仅仅是字符串。


查看完整回答
反对 回复 2019-07-30
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这是一个快速的解决方案

dict = list(AA = '0101', AC = '0102', AG = '0103')foo2 = foofor (i in 1:3){foo2 <- replace(foo2, foo2 == names(dict[i]), dict[i])}


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 555 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信