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

时间:2017-05-23 13:51:34

标签: r dataframe reshape2

我正在查看像这样的数据框

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,如果val为1则取值marker,取值no的新列变量val {1}}如果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,但这些只是占位符。

2 个答案:

答案 0 :(得分:4)

您可以按照以下方式使用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

答案 1 :(得分:4)

只要每个组具有相同数量的元素,您就可以在基础R中使用mkdir -p package/macosx cp Test.icns package/macosx jdk=$(/usr/libexec/java_home) $jdk/bin/javapackager -deploy -native dmg \ -srcfiles Test.jar -appclass package.Test -name Test \ -outdir deploy -outfile Test -v cp deploy/bundles/Test-1.0.dmg installer.dmg ls -l open installer.dmg splitdata.frame添加所需的名称。

setNames