【问题标题】:split column into two with "/" separator in r在 r 中使用“/”分隔符将列分成两部分
【发布时间】:2012-04-18 02:53:36
【问题描述】:

我有以下类型的数据,尽管 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" "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"

我想将每列分成两个“/”是分隔符。因此输出看起来像:

    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

【问题讨论】:

  • 我没有答案,但您应该添加“应用”标签。

标签: r split dataframe


【解决方案1】:

这是一个稍微有点迂回的方法。在字符之间添加“/”并将其作为分隔符读入:

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

【讨论】:

  • 那是天才。我非常喜欢这个解决方案。我打赌这是迄今为止最快最简单的方法。希望张贴者回顾一下这个解决方案。 +1
  • 任何功劳都应该归于@G-Grothendieck。转换为文本流的技巧是我从他那里学到的。
【解决方案2】:

这是使用 reshape2 的 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)

产量:

  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

【讨论】:

  • 谢谢,非常好 - 小错字:“paste0”应该是“paste”
  • @JohnCLK - R 2.15 添加了 paste0,定义为 paste0(..., collapse) is equivalent to paste(..., sep = "", collapse), slightly more efficiently.。来自?pastestat.ethz.ch/R-manual/R-devel/library/base/html/paste.html
  • 谢谢Chase,其实我需要更新到2.15...我忘记了
【解决方案3】:

以下应该在基础 R 中执行。

l <- apply(mymat, 2, function(m) data.frame(matrix(unlist(strsplit(m, '/')), ncol = 2, byrow = TRUE)))
do.call(cbind, l)

【讨论】:

  • 我起初考虑过这种方法,但colsplit 太好了,我改用了这条路线。 +1 colsplit 的灵活性为您提供了海报所要求的列名。
  • 我喜欢这个功能,因为它比我的大数据重塑要快得多
【解决方案4】:

在我的“splitstackshape”包的无耻自我推销中,这是另一个解决方案:

您的数据(在data.frame 阶段停止,而不是像您在问题中所做的那样将其转换为matrix):

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

安装并加载“splitstackshape”包,并使用“concat.split.multiple”(让您一次拆分多列)来获得所需的输出:

## 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2021-08-31
    • 2022-08-10
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多