Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.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
为什么在执行map(str_match_all())之后需要将数据帧索引到map()?_R_Dplyr_Tidyverse_Stringr_Purrr - Fatal编程技术网

为什么在执行map(str_match_all())之后需要将数据帧索引到map()?

为什么在执行map(str_match_all())之后需要将数据帧索引到map()?,r,dplyr,tidyverse,stringr,purrr,R,Dplyr,Tidyverse,Stringr,Purrr,我试图解析包含字符串的数据帧以提取最大值(数字),但遇到了一些问题 如果我从这样一个tibble开始: tester <- tibble("phyloP46way_primate" = c(".{9}", "0.055{1}0.064{3}", "0.225{1}", "0.271{1}", "-0.706{1}-0.708{1}0.248{3}0.298{3}")) 现在,我要做的是对这些“行”中的每一行应用一个函数。但是,当我尝试映射时,它似乎只是将它们全部合并到一个向量中,并从整个

我试图解析包含字符串的数据帧以提取最大值(数字),但遇到了一些问题

如果我从这样一个tibble开始:

tester <- tibble("phyloP46way_primate" = c(".{9}", "0.055{1}0.064{3}", "0.225{1}", "0.271{1}", "-0.706{1}-0.708{1}0.248{3}0.298{3}"))
现在,我要做的是对这些“行”中的每一行应用一个函数。但是,当我尝试映射时,它似乎只是将它们全部合并到一个向量中,并从整个批次中拾取单个最大值,而不是一个/行:

> map(foo_tbl, function(x) list_to_max(x))
$phyloP46way_primate
$phyloP46way_primate[[1]]
[1] "0.298"
除非我做了一些奇怪的索引并映射到
foo\u tbl[[1]]
而不是
foo\u tbl

map(foo_tbl[[1]], function(x) list_to_max(x)) %>% unlist()
[1] "."     "0.064" "0.225" "0.271" "0.298"
我想我的
列表\u to \u max()
一定做了一些意想不到的事情,因为它们的行为与我预期的一样:

> invisible(map(foo_tbl, function(x) print(paste0("x is: ", x))))
[1] "x is: ."                                              
[2] "x is: c(\"0.055\", \"0.064\")"                        
[3] "x is: 0.225"                                          
[4] "x is: 0.271"                                          
[5] "x is: c(\"-0.706\", \"-0.708\", \"0.248\", \"0.298\")"
> invisible(modify(foo_tbl, function(x) print(paste0("x is: ", x))))
[1] "x is: ."                                              
[2] "x is: c(\"0.055\", \"0.064\")"                        
[3] "x is: 0.225"                                          
[4] "x is: 0.271"                                          
[5] "x is: c(\"-0.706\", \"-0.708\", \"0.248\", \"0.298\")"
以下是我的功能:

list_to_max <- function(character_vector) {
  numbers <- suppressWarnings(as.numeric(character_vector))
  if (all(is.na(numbers))) {
    return(".")
    } else {
      numbers %>% max(., na.rm = TRUE) %>% toString()
    }
}
list_to_max%toString()
}
}

toString
将所有内容强制转换为逗号分隔的字符串,这不是很有用。以下是将所有内容保持在原始data.frame中的工作流:

库(tidyverse)
测试员%
突变(p_clean=gsub('\{.*.'\}','',phyloP46way_灵长类动物),
p_list=strsplit(p_clean,\\s+),
p_列表=映射(p_列表,如.numeric),
p_max=map_dbl(p_列表,max))
#>#A tibble:5 x 4
#>phyloP46way_灵长类动物p_清洁p_列表p_最大值
#>                                                           
#> 1                               .{9}                         .      NA
#> 2                   0.055{1}0.064{3}               0.055 0.064   0.064
#> 3                           0.225{1}                     0.225   0.225
#> 4                           0.271{1}                     0.271   0.271
#> 5 -0.706{1}-0.708{1}0.248{3}0.298{3} -0.706 -0.708 0.248 0.298   0.298

这种方法的一个问题是,我的真实数据的某些字段既包含空值(“.”)又包含数字,例如“0.55{1}.{3}”
as.numeric()
将“.”转换为NA,并且
max(c(0.55,NA))
返回NA,而不是0.55。因此,如果存在空值,则变异工作流将以错误的p_max结束。。。我在重复它,但会喜欢更多的建议!首先,
NULL
NA
在R中是不同的东西,所以谈论“NULL”值很容易混淆。实际上,将数据存储为
NA
NULL
或用于表示缺失数据的任何字符串或数字更有用。在代码方面,您可以在max中使用na.rm=TRUE,但当只有时,它将返回-Inf,尽管这可以转换回na
list_to_max <- function(character_vector) {
  numbers <- suppressWarnings(as.numeric(character_vector))
  if (all(is.na(numbers))) {
    return(".")
    } else {
      numbers %>% max(., na.rm = TRUE) %>% toString()
    }
}