字典样式替换多个项目

字典样式替换多个项目

我有一个大型的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个键/值对的字典?


扬帆大鱼
浏览 561回答 3
3回答

小怪兽爱吃肉

map&nbsp;=&nbsp;setNames(c("0101",&nbsp;"0102",&nbsp;"0103"),&nbsp;c("AA",&nbsp;"AC",&nbsp;"AG"))foo[]&nbsp;<-&nbsp;map[unlist(foo)]假设map涵盖了所有案例foo。如果foo是一个矩阵(字符()),这会感觉不像'黑客',在空间和时间上都更有效率,然后matrix(map[foo],&nbsp;nrow=nrow(foo),&nbsp;dimnames=dimnames(foo))当存在数百万个SNP和数千个样本时,矩阵和数据帧变体都与R 2的矢量大小限制相差2 ^ 31-1。

慕斯709654

如果您愿意使用包,那么它plyr是一个非常受欢迎的包,并且具有这个方便的mapvalues()函数,可以满足您的需求:foo&nbsp;<-&nbsp;mapvalues(foo,&nbsp;from=c("AA",&nbsp;"AC",&nbsp;"AG"),&nbsp;to=c("0101",&nbsp;"0102",&nbsp;"0103"))请注意,它适用于所有类型的数据类型,而不仅仅是字符串。

凤凰求蛊

这是一个快速的解决方案dict&nbsp;=&nbsp;list(AA&nbsp;=&nbsp;'0101',&nbsp;AC&nbsp;=&nbsp;'0102',&nbsp;AG&nbsp;=&nbsp;'0103')foo2&nbsp;=&nbsp;foofor&nbsp;(i&nbsp;in&nbsp;1:3){foo2&nbsp;<-&nbsp;replace(foo2,&nbsp;foo2&nbsp;==&nbsp;names(dict[i]),&nbsp;dict[i])}
打开App,查看更多内容
随时随地看视频慕课网APP