在强制转换(dcast)分配新列标题时是否可以更改默认分隔符?
我正在将文件从long转换为wide,我得到以下标题:
value_1, value_2, value_3,...
在重塑中你可以分配“sep”参数(sep =“”)和列标题输出,就像我想要的那样:
value1, value2, value3,...
但是,对于我的数据框,重塑需要几分钟,超过200,000行,而dcast需要几秒钟。 dcast还按照我想要的顺序输出列,而reshape则没有。有没有简单的方法可以使用dcast更改输出,还是需要手动更改列标题?
例如:
example <- data.frame(id=rep(c(1,2,3,4),4),index=c(rep(1,4),rep(2,4),rep(1,4),rep(2,4)),variable=c(rep("resp",8),rep("conc",8)),value=rnorm(16,5,1))
dcast(example,id~variable+index)
该示例给出了列标题:
conc_1, conc_2, resp_1, resp_2
我希望列标题为:
conc1, conc2, resp1, resp2
我试过了:
dcast(example,id~variable+index,sep="")
dcast似乎完全忽略了sep,因为给出一个符号也不会改变输出。
答案 0 :(得分:3)
您不能,因为该选项未纳入dcast
。但是在运行dcast
之后执行此操作非常简单。
casted_data <- dcast(example,id~variable+index)
library(stringr)
names(casted_data) <- str_replace(names(casted_data), "_", ".")
> casted_data
id conc.1 conc.2 resp.1 resp.2
1 1 5.554279 5.225686 5.684371 5.093170
2 2 4.826810 5.484334 5.270886 4.064688
3 3 5.650187 3.587773 3.881672 3.983080
4 4 4.327841 4.851891 5.628488 4.305907
# If you need to do this often, just wrap dcast in a function and
# change the names before returning the result.
f <- function(df, ..., sep = ".") {
res <- dcast(df, ...)
names(res) <- str_replace(names(res), "_", sep)
res
}
> f(example, id~variable+index, sep = "")
id conc1 conc2 resp1 resp2
1 1 5.554279 5.225686 5.684371 5.093170
2 2 4.826810 5.484334 5.270886 4.064688
3 3 5.650187 3.587773 3.881672 3.983080
4 4 4.327841 4.851891 5.628488 4.305907
答案 1 :(得分:2)
答案 2 :(得分:2)
基于information provided by dbetebenner和另一个using data.table
for improved dcast
functionality示例,您的示例变为:
> library(data.table)
> dcast(setDT(example), id ~ variable + index, sep="")
id conc1 conc2 resp1 resp2
1: 1 5.113707 5.475527 5.938592 4.149636
2: 2 4.261278 6.138082 5.277773 5.907054
3: 3 4.350663 4.292398 6.277582 4.167552
4: 4 5.993198 6.601669 5.232375 5.037936
setDT()
通过引用将列表和data.frames
转换为data.tables
。
使用data.table
v1.9.6。
答案 3 :(得分:1)
一个选项:
example <- data.frame(example,by=paste(example$variable,example$index,sep=""))
dcast(example,id~by)