我有一个混合了数字和字母的大型数据集。只是一个小例子:
sex <- c("M", "F", "F", "M", "M")
ind <- c("I1", "I2", "I3", "I4", "C")
M1 <- c("ab", "bb", "ac", "ad", "dd")
M2 <- c(12, 22, 23, 24, 25)
M3 <- c("AT", "AG", "AC", "GG", "TC")
M4 <- c(22, 23, 24, 14, 24)
mydf <- data.frame(sex, ind, M1, M2, M3, M4)
mydf
sex ind M1 M2 M3 M4
1 M I1 ab 12 AT 22
2 F I2 bb 22 AG 23
3 F I3 ac 23 AC 24
4 M I4 ad 24 GG 14
5 M C dd 25 TC 24
我想在列M1 ...... Mn(文件末尾)中的两个字符之间引入“/”标记,以便生成的数据框看起来像:
sex ind M1 M2 M3 M4
1 M I1 a/b 1/2 A/T 2/2
2 F I2 b/b 2/2 A/G 2/3
3 F I3 a/c 2/3 A/C 2/4
4 M I4 a/d 2/4 G/G 1/4
5 M C d/d 2/5 T/C 2/4
抱歉,我一无所知如何继续...你的帮助表示赞赏...
答案 0 :(得分:2)
一个班轮:
> data.frame(lapply(mydf, function(x) sub("(.)(.)", "\\1/\\2", x)))
sex ind M1 M2 M3 M4
1 M I/1 a/b 1/2 A/T 2/2
2 F I/2 b/b 2/2 A/G 2/3
3 F I/3 a/c 2/3 A/C 2/4
4 M I/4 a/d 2/4 G/G 1/4
5 M C d/d 2/5 T/C 2/4
答案 1 :(得分:1)
R的所有神秘力量都能为你提供:
splitInsert
使用strsplit
在每个字母处拆分一列,并将其与paste
重新组合。这包含在sapply
中以向量化函数。lapply
将splitInsert
应用于data.frame的第3:6列,并data.frame
将其与您不想修改的两列相结合。 splitInsert
完全是通用的 - 它适用于任何长度的文本字符串,您可以使用任何新的选择字符重新组合拆分元素。代码:
splitInsert <- function(x, split="", new="/"){
sapply(x, function(y)
paste(
strsplit(as.character(y), split=split)[[1]],
collapse=new)
)
}
data.frame(mydf[, 1:2], lapply(mydf[, 3:ncol(mydf)], splitInsert))
结果:
sex ind M1 M2 M3 M4
1 M I1 a/b 1/2 A/T 2/2
2 F I2 b/b 2/2 A/G 2/3
3 F I3 a/c 2/3 A/C 2/4
4 M I4 a/d 2/4 G/G 1/4
5 M C d/d 2/5 T/C 2/4
答案 2 :(得分:0)
这似乎有效。
m1 <- substr(mydf$M1, start=1, stop=1)
m2 <- substr(mydf$M1, start=2, stop=2)
paste(m1, m2, sep="/")
输出
[1] "a/b" "b/b" "a/c" "a/d" "d/d"