到目前为止,我还没有找到解决办法...这一个是最接近的:1
以下是我的数据框的一小部分,df:
ANIMAL(chr) MARKER(int) GENOTYPE(int)
"1012828" 1550978 0
"1012828" 1550982 2
"1012828" 1550985 1
"1012830" 1550982 0
"1012830" 1550985 2
"1012830" 1550989 2
我想要的是这个......
ANIMAL MARKER_1550978 MARKER_1550982 MARKER_1550985 MARKER_1550989
"1012828" 0 2 1 NA
"1012830" NA 0 2 2
我的想法,最初是根据引用的问题为每个标记创建列
markers <- unique(df$MARKER)
df[,markers] <- NA
因为我不能在R中使用列名的整数。我在每个新列中添加了“MARKER_”以便它可以工作:
df$MARKER <- paste("MARKER_",df$MARKER)
markers <- unique(df$MARKER)
df[,markers] <- NA
现在我拥有了所有新列,但行数相同。我可以毫无问题地删除不必要的行和列,但是如何使用MARKER和ANIMAL正确的GENOTYPE正确填充我的新列?我猜测其中一个或多个:索引,匹配,%in%...但不知道从哪里开始。在stackoverflow中搜索这些内容并没有产生任何与我的挑战相关的东西。
答案 0 :(得分:1)
您要问的是一种非常常见的数据帧操作,通常称为“传播”或“扩展”。此操作的反向是“聚集”。查看此handy cheatsheet,特别是有关重塑数据的部分。
library(tidyr)
df %>% spread(MARKER, GENOTYPE)
#> ANIMAL 1550978 1550982 1550985 1550989
#> 1 1012828 0 2 1 NA
#> 2 1012830 NA 0 2 2