R 中的熔化和重塑

Melting & reshaping in R

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

|variable    value |
|cs_ta_p50    ...  |

为了解决这个问题,我需要创建一个变量“'type'”和“'dec'”

我尝试通过以下方式做到这一点:

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|

我猜这与正则表达式错误有关,那我该怎么办?

有点卡,但应该可以!

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

使用 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)]