使用因子列熔化R data.table

时间:2017-10-17 22:30:14

标签: r dataframe data.table melt

我有以下R data.table(尽管这也应该与data.frame一起扩展)。目标是重塑此data.table以在ggplot2中绘制为散点图。因此,我需要重新设计这个data.table,以便有一个"因素"要为点着色的列:

> library(data.table)
> dt
   ID                   x_A               y_A        x_B       y_B                                                                                                                                                                                                  
   1:   05AC            0.81               3          0.92      2.05                                                                                                                                                                                                   
   2:   01BA            0.41               5          0.63      1.8                                                                                                                                                                                                   
   3:   Z1AC            0.41               5          0.58      1.8                                                                                                                                                                                                   
   4:   B2BA            0.21             6.5          1.00      1.8   
   ....

我认为正确的输出需要采用以下形式:

ID     type   x      y
05AC   A      0.81   3       
05AC   B      0.92   2.05
01BA   A      0.41   5 
01BA   B      0.63   1.8
Z1AC   A      0.41   5 
Z1AC   B      0.58   1.8
B2BA   A      0.21   6.5 
B2BA   B      1.00   1.8

是否有标准的方式来展开"展开" data.tables这种方式?我很高兴在这种情况下如何使用dplyr,但我怀疑应该有一个data.table方法。

melt()可行,如果我可以弄清楚如何创建列type,例如

melt(dt, id.vars=c("ID")) 

只会根据一列ID

进行融合

我特别困惑一个人如何刮擦" A列和B列分别来自第2-3栏和第4-5列......

2 个答案:

答案 0 :(得分:3)

保持在data.table之内,在您使用melt建议的方法后,您可以tstrsplit根据" _"分割变量字符。

## use tstrsplit to split a column on a regular expression
dt[, c("xy", "type") := tstrsplit(variable, "_")]
dt 
#       ID variable value xy type
#  1: 05AC      x_A  0.81  x    A
#  2: 01BA      x_A  0.41  x    A
#  3: Z1AC      x_A  0.41  x    A
#  4: B2BA      x_A  0.21  x    A
#  5: 05AC      y_A  3.00  y    A
#  6: 01BA      y_A  5.00  y    A
#  7: Z1AC      y_A  5.00  y    A
#  8: B2BA      y_A  6.50  y    A
#  9: 05AC      x_B  0.92  x    B
# 10: 01BA      x_B  0.63  x    B
# 11: Z1AC      x_B  0.58  x    B
# 12: B2BA      x_B  1.00  x    B
# 13: 05AC      y_B  2.05  y    B
# 14: 01BA      y_B  1.80  y    B
# 15: Z1AC      y_B  1.80  y    B
# 16: B2BA      y_B  1.80  y    B

这为您提供了所需解决方案的长篇大论。然后,您可以使用dcast来扩大它

dcast(dt, formula = ID + type ~ xy)

#      ID type    x    y
# 1: 01BA    A 0.41 5.00
# 2: 01BA    B 0.63 1.80
# 3: 05AC    A 0.81 3.00
# 4: 05AC    B 0.92 2.05
# 5: B2BA    A 0.21 6.50
# 6: B2BA    B 1.00 1.80
# 7: Z1AC    A 0.41 5.00
# 8: Z1AC    B 0.58 1.80

此答案的逻辑与dplyr的建议gather %>% separate %>% spread方法相同,但使用data.table

答案 1 :(得分:2)

dplyrtidyr的组合可以产生您想要的结果。由于缺乏可重复的例子,这是未经测试的。

library(tidyr)
library(dplyr)

dt %>% 
  gather(variable, value, -ID) %>% 
  separate(variable, c("group", "type"), sep = "\\_") %>% 
  spread(group, value, na.rm = TRUE)

这是做什么的:

  1. 将除ID列以外的所有列收集到键值行,变量和值中。
  2. 使用_作为分隔符,将变量列分隔为组并键入。
  3. 将组行的内容分散到列中,并使用值列填充它们,删除所有NA组合。