使用值作为以其他变量为条件的新变量
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 |
+----+-----+----+
我怀疑这可以通过 reshape2
的 cast
函数来完成,但我无法理解它。
编辑: 根据答案和我的真实数据集::
- 第一列只是数据帧索引,不是它自己的变量!抱歉造成混淆。
marker
中0和1的个数不一定是顺序的,也不一定是同一个数。 val
只是一个值。我在这里放了 1 到 10,但这些只是占位符。
您可以按如下方式使用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 中使用 split
和 data.frame
。setNames
添加所需的名称。
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
我正在查看这样的数据框
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 |
+----+-----+----+
我怀疑这可以通过 reshape2
的 cast
函数来完成,但我无法理解它。
编辑: 根据答案和我的真实数据集::
- 第一列只是数据帧索引,不是它自己的变量!抱歉造成混淆。
marker
中0和1的个数不一定是顺序的,也不一定是同一个数。val
只是一个值。我在这里放了 1 到 10,但这些只是占位符。
您可以按如下方式使用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 中使用 split
和 data.frame
。setNames
添加所需的名称。
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