在 R 中,我想根据字符串复制多列

问题描述 投票:0回答:2

我有三列,它们具有多个值,但此后包含不同的字符串。这些值出现在“;”之后但字符串不同。我希望能够将下面的专栏变成两栏。也可以有两个以上的值,我在这个例子中只使用了两个。

我连续有这个;

Cola <- c("Qxxxx7; Pxxxx8")
Colb <- c("Qxxxx7 [1-24]; Pxxxx8 [1-24]")
Colc <- c("Qxxxx7 1xAcetyl [N-Term]; 1xPhospho [S4(100)]; Pxxxx8 1xAcetyl [N-Term]; 1xPhospho [S10(100)]")

我需要将它们分成两行。

  • 第 1 行:
Cola <- c("Qxxxx7")
Colb <- c("Qxxxx7 [1-24]")
Colc <- c("Qxxxx7 1xAcetyl [N-Term]; 1xPhospho [S4(100)]")
  • 第 2 行
Cola <- c("Pxxxx8")
Colb <- c("Pxxxx8 [1-24]")
Colc <- c("Pxxxx8 1xAcetyl [N-Term]; 1xPhospho [S10(100)]")
r regex string strsplit
2个回答
0
投票

有这样的事吗?它使用辅助函数用第一个分号分隔每个值。然后用

do.call
cbind
将列放在一起。

Cola <- c("Qxxxx7; Pxxxx8")
Colb <- c("Qxxxx7 [1-24]; Pxxxx8 [1-24]")
Colc <- c("Qxxxx7 1xAcetyl [N-Term]; 1xPhospho [S4(100)]; Pxxxx8 1xAcetyl [N-Term]; 1xPhospho [S10(100)]")

df1 <- data.frame(Cola, Colb, Colc)

f <- function(x) {
  r1 <- sub(";.*", "", x)
  r2 <- sub("^[^;]*;\\s*", "", x)
  c(r1, r2)
}
lapply(df1, f) |> do.call(cbind.data.frame, args = _)
#>     Cola          Colb
#> 1 Qxxxx7 Qxxxx7 [1-24]
#> 2 Pxxxx8 Pxxxx8 [1-24]
#>                                                                  Colc
#> 1                                            Qxxxx7 1xAcetyl [N-Term]
#> 2 1xPhospho [S4(100)]; Pxxxx8 1xAcetyl [N-Term]; 1xPhospho [S10(100)]

创建于2023年12月6日


0
投票
do.call(cbind, sapply(df1, function(x) strsplit(x, split = "; (?=Pxx)", perl = T)))
#>      a        b               c                                               
#> [1,] "Qxxxx7" "Qxxxx7 [1-24]" "Qxxxx7 1xAcetyl [N-Term]; 1xPhospho [S4(100)]" 
#> [2,] "Pxxxx8" "Pxxxx8 [1-24]" "Pxxxx8 1xAcetyl [N-Term]; 1xPhospho [S10(100)]"

创建于 2023-12-06,使用 reprex v2.0.2

数据:

A1 <- c("Qxxxx7; Pxxxx8")
B1 <- c("Qxxxx7 [1-24]; Pxxxx8 [1-24]")
C1 <- c("Qxxxx7 1xAcetyl [N-Term]; 1xPhospho [S4(100)]; Pxxxx8 1xAcetyl [N-Term]; 1xPhospho [S10(100)]")

df1 <- data.frame(a = A1, b = B1, c = C1)
© www.soinside.com 2019 - 2024. All rights reserved.