用“将列一分为二”/&引用;r中的分离器
我有以下类型的数据,尽管data.frame非常大用“将列一分为二”/&引用;r中的分离器,r,split,dataframe,R,Split,Dataframe,我有以下类型的数据,尽管data.frame非常大 A1 <- c("A/B", "A/A", "B/B", "A/A") B1 <- c("B/B", "C/C", "C/B", "D/A") C1 <- c("B/B", "C/C", "C/B", "D/A") mydf <- data.frame (A1, B1, C1) mymat <- as.matrix (mydf) mymat A1 B1 C1 [1,] "A/B"
A1 <- c("A/B", "A/A", "B/B", "A/A")
B1 <- c("B/B", "C/C", "C/B", "D/A")
C1 <- c("B/B", "C/C", "C/B", "D/A")
mydf <- data.frame (A1, B1, C1)
mymat <- as.matrix (mydf)
mymat
A1 B1 C1
[1,] "A/B" "B/B" "B/B"
[2,] "A/A" "C/C" "C/C"
[3,] "B/B" "C/B" "C/B"
[4,] "A/A" "D/A" "D/A"
下面是一个使用Reforme2的colsplit的解决方案:
require(reshape2)
mymat <- as.data.frame(mymat)
LS <- lapply(seq_along(mymat), function(i){
colsplit(mymat[, i], "/", paste0(colnames(mymat)[i], letters[1:2]))
}
)
do.call('cbind', LS)
下面的代码应该在base R中完成
l <- apply(mymat, 2, function(m) data.frame(matrix(unlist(strsplit(m, '/')), ncol = 2, byrow = TRUE)))
do.call(cbind, l)
l这里有一个稍微迂回的方法。在字符之间添加“/”,并将其作为分隔符读入:
splitdf <- read.table(text=capture.output(write.table(mydf, quote=FALSE,
sep="/",col.names=FALSE,row.names=FALSE)),
sep="/")
names(splitdf) <- paste( rep(names(mydf), each=2), c("a","b"), sep="")
splitdf
#------------
A1a A1b B1a B1b C1a C1b
1 A B B B B B
2 A A C C C C
3 B B C B C B
4 A A D A D A
splitdf在我的“splitstackshape”软件包的无耻自我推广中,这里有另一个解决方案:
您的数据(停止在data.frame
阶段,而不是像您在问题中那样将其转换为矩阵
):
我没有答案,但你应该添加“应用”标签。谢谢,这很好-输入很少:“paste0”应该是“粘贴”@JohnCLK-R 2.15添加的paste0定义为paste0(…,collapse)相当于粘贴(…,sep=“”,collapse),效率稍高。
。从?粘贴
:谢谢Chase,实际上我需要更新到2.15…我忘记了我一开始考虑过这种方法,但是colsplit
太好了,我选择了这条路线+1.colsplit
的灵活性让你准确地知道海报要求的列名。我喜欢这个功能,因为它比重塑我的大数据要快得多。这真是天才。我非常喜欢这个解决方案。我打赌这是迄今为止最快最简单的方法。希望海报能回顾一下这个解决方案+1任何信贷都可能转移给@G-Grothendieck。转换成文本流的技巧是我从他那里学到的。
l <- apply(mymat, 2, function(m) data.frame(matrix(unlist(strsplit(m, '/')), ncol = 2, byrow = TRUE)))
do.call(cbind, l)
splitdf <- read.table(text=capture.output(write.table(mydf, quote=FALSE,
sep="/",col.names=FALSE,row.names=FALSE)),
sep="/")
names(splitdf) <- paste( rep(names(mydf), each=2), c("a","b"), sep="")
splitdf
#------------
A1a A1b B1a B1b C1a C1b
1 A B B B B B
2 A A C C C C
3 B B C B C B
4 A A D A D A
A1 <- c("A/B", "A/A", "B/B", "A/A")
B1 <- c("B/B", "C/C", "C/B", "D/A")
C1 <- c("B/B", "C/C", "C/B", "D/A")
mydf <- data.frame (A1, B1, C1)
mydf
# A1 B1 C1
# 1 A/B B/B B/B
# 2 A/A C/C C/C
# 3 B/B C/B C/B
# 4 A/A D/A D/A
## install.packages("splitstackshape")
library(splitstackshape)
concat.split.multiple(mydf, 1:3, "/")
# A1_1 A1_2 B1_1 B1_2 C1_1 C1_2
# 1 A B B B B B
# 2 A A C C C C
# 3 B B C B C B
# 4 A A D A D A