【问题标题】:Populate multiple columns by values in one column [duplicate]按一列中的值填充多列[重复]
【发布时间】:2017-05-04 15:06:32
【问题描述】:

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

【问题讨论】:

  • 您希望将数据框从窄到宽展开。查看tidyr::spread
  • 特别是tidyr::spread(df, MARKER, GENOTYPE)

标签: r


【解决方案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

【讨论】:

  • 非常感谢,效果很好!
猜你喜欢
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多