我有一个数据框M
。我想提取由":"
分隔的每个字符串的第一部分。我使用strsplit
但结果是一个大字符而不是数据框。有人可以帮忙吗?
M <- read.table(text=
"1/1:205,54,0:18:0:57 1/1:141,39,0:13:0:42 0/0:0,54,255:18:0:45 1/1:174,48,0:16:0:51 0/0:0,84,255:28:0:75
0/0:0,78,255:26:0:99 0/0:0,63,255:21:0:86 0/0:0,45,255:15:0:68 0/0:0,48,255:16:0:71 0/0:0,132,255:44:0:99
0/0:0,78,255:26:0:89 0/0:0,78,255:26:0:89 0/0:0,36,255:12:0:47 0/0:0,33,255:11:0:44 0/0:0,108,255:36:0:99
0/0:0,75,255:25:0:99 0/0:0,54,255:18:0:78 0/0:0,69,255:23:0:93 0/0:0,33,255:11:0:57 0/0:0,96,255:32:0:99
0/0:0,60,75:21:0:74 0/0:0,51,84:17:0:65 0/0:0,48,64:17:0:62 0/0:0,42,65:15:0:56 0/0:0,84,99:28:0:98 ",
head=F, stringsAsFactors=F)
S <- sapply(strsplit(M, ":"), "[", 1)
答案 0 :(得分:5)
使用strsplit
可能不是最好,因为我们只对子字符串感兴趣。假设OP有兴趣了解strsplit
如何用于此示例数据集,则修改OP的代码将使用嵌套的lapply/sapply
循环。
M[] <- lapply(M, function(x) sapply(strsplit(as.character(x), ':'),'[',1))
M
# V1 V2 V3 V4 V5
#1 1/1 1/1 0/0 1/1 0/0
#2 0/0 0/0 0/0 0/0 0/0
#3 0/0 0/0 0/0 0/0 0/0
#4 0/0 0/0 0/0 0/0 0/0
#5 0/0 0/0 0/0 0/0 0/0
或者由于列都相似,我们可以unlist
,使用strsplit
并为输出分配原始数据集,以便我们可以保持原始结构对于我们得到的输出完好无损。
M[] <- sapply(strsplit(unlist(M), ':'),'[',1)
或者更快的选择是使用stri_extract_first
中的stringi
来提取不是:
的字符。
library(stringi)
M[] <- stri_extract_first(unlist(M), regex='[^:]+')
答案 1 :(得分:4)
尝试:
dplyr::mutate_each(M, funs(sub("(.*?)(:.*)", "\\1" , .)))
给出了:
# V1 V2 V3 V4 V5
#1 1/1 1/1 0/0 1/1 0/0
#2 0/0 0/0 0/0 0/0 0/0
#3 0/0 0/0 0/0 0/0 0/0
#4 0/0 0/0 0/0 0/0 0/0
#5 0/0 0/0 0/0 0/0 0/0
答案 2 :(得分:4)
您可以使用sub()
M[] <- lapply(M, sub, pattern = ":.*", replacement = "")
M
# V1 V2 V3 V4 V5
# 1 1/1 1/1 0/0 1/1 0/0
# 2 0/0 0/0 0/0 0/0 0/0
# 3 0/0 0/0 0/0 0/0 0/0
# 4 0/0 0/0 0/0 0/0 0/0
# 5 0/0 0/0 0/0 0/0 0/0
以上内容将覆盖原始M
数据。如果您不想覆盖M
,请先将其分配给新的变量名称,或者只使用as.data.frame()
周围的lapply()
as.data.frame(lapply(M, sub, pattern = ":.*", replacement = ""))