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)]
我有一种情况,我的数据框中的变量名称包含有关多个变量的信息。例如,"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)]