Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在r中提取数据帧中每个字符串的第一部分_R - Fatal编程技术网

在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='[^:]+')