使用值作为以其他变量为条件的新变量

Use values as new variables conditional on other variable

我正在查看这样的数据框

marker <- c(rep(0, 5), rep(1, 5))
val <- c(1:10)

df <- data.frame(marker, val)

看起来像这样:

+-----+--------+------+
|     | marker |  val |
+-----+--------+------+
|  1  |    0   |    1 |
|  2  |    0   |    2 |
|  3  |    0   |    3 |
|  4  |    0   |    4 |
|  5  |    0   |    5 |
|  6  |    1   |    6 |
|  7  |    1   |    7 |
|  8  |    1   |    8 |
|  9  |    1   |    9 |
| 10  |    1   |   10 |
+-----+--------+------+

我想创建一个新的列变量 yes,如果 marker 为 1,它的值为 val,而新的列变量 no 则为值 val 如果 marker 为 0。所以我想要这样:

+----+-----+----+
|    |  no | yes|
+----+-----+----+
| 1  |   1 |  6 |
| 2  |   2 |  7 |
| 3  |   3 |  8 |
| 4  |   4 |  9 |
| 5  |   5 | 10 |
+----+-----+----+

我怀疑这可以通过 reshape2cast 函数来完成,但我无法理解它。

编辑: 根据答案和我的真实数据集::

您可以按如下方式使用tidyverse

library(tidyverse)

df %>% 
 group_by(marker) %>% 
 mutate(new = seq(n())) %>% 
 spread(marker, val)

# A tibble: 5 × 3
#    new   `0`   `1`
#* <int> <int> <int>
#1     1     1     6
#2     2     2     7
#3     3     3     8
#4     4     4     9
#5     5     5    10

只要每个组的元素数量相同,就可以在 base R 中使用 splitdata.framesetNames 添加所需的名称。

setNames(data.frame(split(df$val, df$marker)), c("No", "Yes"))
  No Yes
1  1   6
2  2   7
3  3   8
4  4   9
5  5  10