我有一种情况,我的数据框中的变量名称包含有关多个变量的信息。例如," 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|
我想这与正则表达式错误有关,所以我该怎么做?
答案 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