我希望将每一列内用逗号分隔的值对分割为新数据框架内的两个相邻列,并为两列中的每一列使用相同的列名。
也就是说,我想把它转换成:
A B C D E
1,1 0,1 1,1 1,1 1,1
1,1 1,1 1,1 1,1 1,1
0,1 0,1 0,1 0,1 0,1 对此:
A A B B C C D D E E
1 1 0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1如果数据帧名称不能有精确的副本,A_1和A_2.等等,应该没问题。或者,将名称放在dataframe的第一行而不是作为标题也可以。
我的实际数据集是~200列×13,000行,所以我需要一种自动的方法来分割列并为第二个版本的数据帧指定名称。
发布于 2014-11-17 04:50:41
你可以用
library(splitstackshape)
(newdf <- cSplit(df, names(df), ","))
# A_1 A_2 B_1 B_2 C_1 C_2 D_1 D_2 E_1 E_2
# 1: 1 1 0 1 1 1 1 1 1 1
# 2: 1 1 1 1 1 1 1 1 1 1
# 3: 0 1 0 1 0 1 0 1 0 1要创建重复的列名,可以执行以下操作,因为data.table也加载了splitstackshape
setnames(newdf, names(newdf), sub("_.*", "", names(newdf)))
newdf
# A A B B C C D D E E
# 1: 1 1 0 1 1 1 1 1 1 1
# 2: 1 1 1 1 1 1 1 1 1 1
# 3: 0 1 0 1 0 1 0 1 0 1但你要知道,有重复的列名是个糟糕的主意。
发布于 2014-11-17 06:05:54
我不想在这里自责,但是,随着“弦I”包的最新发展,cSplit不再为这种类型的工作拿蛋糕了。
下面是一种使用Stringi的方法(尽管它是针对这个问题的)。
首先,创建一个拆分函数:
library(stringi)
Stringi <- function(indf) {
X <- do.call(cbind, lapply(indf, stri_split_fixed, ",", simplify = TRUE))
`dimnames<-`(`dim<-`(as.numeric(X), dim(X)),
list(NULL, paste0(rep(names(indf), each = 2), 1:2)))
}第二,应用它:
Stringi(df)
# A1 A2 B1 B2 C1 C2 D1 D2 E1 E2
# [1,] 1 1 0 1 1 1 1 1 1 1
# [2,] 1 1 1 1 1 1 1 1 1 1
# [3,] 0 1 0 1 0 1 0 1 0 1在13000行200列上,cSplit占用我的时间不到11秒,而Stringi的时间不到2.5秒。
显然,对于未来版本的上个月我的这个要点显示了 :-)使用该版本的cSplit,时间从11秒降至大约2.7秒。
https://stackoverflow.com/questions/26965707
复制相似问题