重塑 R 中的数据,转换函数参数

Reshape data in R, cast function arguments

我有一个名为 "wc" 的数据框,格式如下

PARENT_MOL_CHEMBL_ID    TARGET_TYPE
C10                      ABL 
C10                      EGFR
C939                     TP53

我想按以下格式重塑矩阵: 期望的输出

PARENT_MOL_CHEMBL_ID  ABL  EGFR  TP53
C10                     1    1     0
C939                    0    0     1

我已经阅读了 R 中的 reshape 包。 我试过调用 cast 函数,但它不起作用。

cast(wc,PARENT_MOL_CHEMBL_ID~TARGET_TYPE, value = "TARGET_TYPE")

我不明白我应该在值部分使用什么参数。请指导我如何将 data.frame 转换为所需的形状。

如果有更好的替代方案,如 plyr 函数,请也突出显示替代方案。谢谢

library(tidyverse)

# create an example dataset
wc <- data.frame(PARENT_MOL_CHEMBL_ID = c("C10", "C10", "C939"), TARGET_TYPE = c("ABL", "EGFR", "TP53"))

wc <- wc %>% 
  # create an auxiliary variable
  mutate(AUX = 1) %>%
  # spread the data from long to wide and fill the empty cells with 0
  # EDIT based on Sotos comment. Thanks! :)
  spread(TARGET_TYPE, AUX, fill = 0)

结果是:

  PARENT_MOL_CHEMBL_ID ABL EGFR TP53
    C10                 1    1    0
   C939                 0    0    1

更多信息:http://www.cookbook-r.com/Manipulating_data/Converting_data_between_wide_and_long_format/

OP 就 reshape 包的 cast() 函数的参数寻求帮助。但是,reshape 包已被同一包作者的 reshape2 包取代。根据包说明,reshape2包是

A Reboot of the Reshape Package

使用reshape2,可以用

产生想要的结果
reshape2::dcast(wc, PARENT_MOL_CHEMBL_ID ~ TARGET_TYPE, fun.aggregate = length, 
                value.var = "TARGET_TYPE")
#  PARENT_MOL_CHEMBL_ID ABL EGFR TP53
#1                  C10   1    1    0
#2                 C939   0    0    1

顺便说一句:data.table 包也实现了(并增强了)dcast()。因此,可以用

产生相同的结果
data.table::dcast(wc, PARENT_MOL_CHEMBL_ID ~ TARGET_TYPE, fun.aggregate = length, 
                  value.var = "TARGET_TYPE")

其他列

OP 数据框中的其他列应与 spreadwide 数据一起显示。不幸的是,OP 没有提供特定的示例数据,因此我们必须考虑两个用例。

案例 1:其他列与 id 列一起使用

数据可能看起来像

wc
#  PARENT_MOL_CHEMBL_ID TARGET_TYPE extra_col1
#1                  C10         ABL          a
#2                  C10        EGFR          a
#3                 C939        TP53          b

注意extra_col1中的值符合PARENT_MOL_CHEMBL_ID.

这是一个简单的例子,因为 dcast() 中的公式接受 ...,它表示公式中未使用的所有其他变量:

reshape2::dcast(wc, ... ~ TARGET_TYPE, fun.aggregate = length, 
                value.var = "TARGET_TYPE")
#  PARENT_MOL_CHEMBL_ID extra_col1 ABL EGFR TP53
#1                  C10          a   1    1    0
#2                 C939          b   0    0    1

结果 data.frame 包含所有其他列。

案例 2:其他列不要与 id 列一起使用

现在,添加了另一列:

wc
#  PARENT_MOL_CHEMBL_ID TARGET_TYPE extra_col1 extra_col2
#1                  C10         ABL          a          1
#2                  C10        EGFR          a          2
#3                 C939        TP53          b          3

请注意 extra_col2C10 有两个不同的值。这将导致简单方法失败。因此,必须实施两步法:首先重塑,然后与原始数据框连接。 data.table 包用于两个步骤,现在:

library(data.table)
# reshape from long to wide, result has only one row per id column
wide <- dcast(setDT(wc), PARENT_MOL_CHEMBL_ID ~ TARGET_TYPE, fun.aggregate = length, 
                value.var = "TARGET_TYPE")
# right join, i.e., all rows of wc are included
wide[wc, on = "PARENT_MOL_CHEMBL_ID"]
#   PARENT_MOL_CHEMBL_ID ABL EGFR TP53 TARGET_TYPE extra_col1 extra_col2
#1:                  C10   1    1    0         ABL          a          1
#2:                  C10   1    1    0        EGFR          a          2
#3:                 C939   0    0    1        TP53          b          3

结果以宽格式显示聚合值以及任何其他列。