在r中提取数据帧中每个字符串的第一部分
我有一个数据帧在r中提取数据帧中每个字符串的第一部分,r,R,我有一个数据帧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
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)
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
您可以使用sub()
使用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
或者更快的选择是使用stri\u extract\u first
从stringi
中提取非字符:
library(stringi)
M[] <- stri_extract_first(unlist(M), regex='[^:]+')
库(stringi)
M[]请提供您的预期输出。我需要“0/0”或“1/1”。sapply(M,函数(x)sapply(strsplit(as.character(x),“:”,“:”,“[”,1))
lapply(M,函数(x)gsub(:*,“,”,x))
您应该在以下位置执行SO搜索:[r]提取每个字符串的第一部分。
。我得到了15次点击。其中一次几乎肯定是重复的。选项1似乎需要很长时间。选项2:给出了很短的时间,但结果数据str仍然是一个大字符,而不是数据帧或字符串matrix@user3354212结果将是一个向量。但是当您将其分配给M[]我对数据str的评论是错误的,我看起来是另一个数据。我喜欢选项3,它只使用了8.14秒,选项2使用了67.73秒。Richard Scriven的答案3使用了155.05秒作为我的真实数据。谢谢。@user3354212你是说选项1使用了155.05秒
。这很有意义,因为我们在那里使用了嵌套循环。stringi
方法应该非常快(选项3)选项1是lapply(M,函数(x)sapply(strsplit(as.character(x),':'),'[',1)),您的代码中有一个错误,>dplyr::mutate_each(M,funs(sub(.*)(:*,“\\1”,))UseMethod(“tbl_vars”):没有适用于“c”类的对象的“tbl_vars”方法('matrix','character')“类(M)
返回什么?从你的问题来看,我假设它是一个数据。帧
M是一个大矩阵。我测试了M作为数据帧。它有效。我的真实数据使用了20.49秒。非常好!
as.data.frame(lapply(M, sub, pattern = ":.*", replacement = ""))
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
M[] <- sapply(strsplit(unlist(M), ':'),'[',1)
library(stringi)
M[] <- stri_extract_first(unlist(M), regex='[^:]+')