融化与融化在R中重塑

时间:2016-08-03 13:46:45

标签: r reshape melt

我有一种情况,我的数据框中的变量名称包含有关多个变量的信息。例如," cs_ta_p50"。我使用melt来融合数据。所以现在我有了

|variable    value |
|cs_ta_p50    ...  |

要解决此问题,我需要创建一个变量'''''和''''

我尝试通过以下方式执行此操作:

cbind(mdata, colsplit(mdata$variable,"(\\_p50)", names=c("type","dec")))

但这会导致

    |variable    value   type     dec |
    |cs_ta_p50    ...   cs_ta      NA |

当我真的需要时

|variable    value   type     dec |
|cs_ta_p50    ...   cs_ta      p50|

我想这与正则表达式错误有关,所以我该怎么做?

2 个答案:

答案 0 :(得分:4)

使用data.table::tstrsplit,您可以分两行进行:

# data
require(data.table)
dt <- data.table(variable = c("cs_ta_p50", "cs_df_p60", "cs_jk_p67"),
                 value = c(1,2,3))

# solution
dt[, c('prefix', 'type', 'dec') := tstrsplit(variable, '_')]
dt[, type := paste(prefix, type, sep = '_')]

修改

感谢@MichaelChirico,好东西。那么完整的解决方案就是

dt[, c('type', 'dec') := tstrsplit(variable, '_(?=[^_]*$)', perl = TRUE)]

答案 1 :(得分:0)

这有点笨拙,但这应该有效!

library(tidyr)

df <- data.frame(variable = c("cs_ta_p50", "cs_df_p60", "cs_jk_p67"))

df_new <- df %>%
    mutate(x = variable) %>%
    separate(x, into = c("type1", "type2", "dec"), sep = c("\\_")) %>%
    mutate(type = paste0(type1, "_", type2)) %>%
    select(variable, type, dec)

df_new

输出:

   variable  type dec
1 cs_ta_p50 cs_ta p50
2 cs_df_p60 cs_df p60
3 cs_jk_p67 cs_jk p67