按一列中的值填充多个列

时间:2017-05-04 15:06:33

标签: r

到目前为止,我还没有找到解决办法...这一个是最接近的: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中搜索这些内容并没有产生任何与我的挑战相关的东西。

1 个答案:

答案 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