- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
下面是我的 gamedata 数据集,以 dput 形式呈现——它包含一些 MLB 比赛的线得分。
structure(list(team = c("NYM", "NYM", "BOS", "NYM", "BOS"), linescore = c("010000000",
"(10)1140006x", "002200010", "00000(11)01x", "311200"), ondate = structure(c(18475,
18476, 18487, 18489, 18494), class = "Date")), class = "data.frame", row.names = c(NA,
-5L))
例如,这里是一个行分数:“002200010”。
有些行分数以“x”结尾,有些在括号中包含两位数,如“00000(11)01x”。括号中没有的每个数字表示球队在该局中得分的次数。如果一支球队在一局中得分超过 9 分,则数字放在括号中,因此在“00000(11)01x”这一行得分中,该球队在第六局得分 11 分,并且没有在底部击球。第九个(用“x”表示)。
并非每个线得分都有九局。有些有更多,有些只有六个。
我需要做什么
首先,我需要做的是获取一支球队在每局比赛中得分多少,例如,第一局,第二局,第三局,等等,然后将每局在新列中得分。我更喜欢使用 dplyr 的解决方案。
我查看了 stackoverflow 的建议解决方案,但没有找到符合我需要的解决方案。如果有的话,如果你能分享它的网址,我将不胜感激。
我已尝试使用此代码:
gamedata %>%
select(ondate, team, linescore) %>%
mutate(inng1 = str_extract(linescore, "\\d|\\(\\d{2}\\)"))
这是输出:
ondate team linescore inng1
2020-08-01 NYM 010000000 0
2020-08-02 NYM (10)1140006x (10)
2020-08-13 BOS 002200010 0
2020-08-15 NYM 00000(11)01x 0
2020-08-20 BOS 311200 3
第二,如何去掉inng1列中'10'的括号?
下面的代码产生了它下面的错误:
gamedata %>%
select(ondate, team, linescore) %>%
mutate(inng1 = str_extract(linescore, "\\d|\\(\\d{2}\\)"))
str_remove_all(inng1,"[()]")
这是我收到的错误消息:
"Error in stri_replace_all_regex(string, pattern, fix_replacement(replacement), : object 'inng1' not found"
第三,我需要知道如何提取每一局的得分,从第二局开始,将每个值放在自己的列中,例如 inng2、inng3 等等。
最后,我应该有上面显示的输出(每个两位数的局都没有括号),每个局都有一个列,所以会有一个标题为“inng1”、“inng2”、“inng3”、“inng4",以此类推。局列中的数据需要是数字,稍后我将对其进行求和。
最佳答案
解决方案02
这是您可以用于这个问题的另一种解决方案,它比第一个更有效,并且主要基于 purrr
系列函数:
library(dplyr)
library(purrr)
df %>%
bind_cols(
map(df %>% select(linescore), ~ strsplit(.x, "\\(|\\)")) %>%
flatten() %>%
map_dfr(~ map(.x, ~ if(nchar(.x) > 2) strsplit(.x, "")[[1]] else .x) %>%
reduce(~ c(.x, .y)) %>%
keep(~ nchar(.x) != 0) %>% t() %>%
as_tibble() %>%
set_names(~ paste0("inng", 1:length(.x)))) %>%
mutate(across(everything(), ~ replace(.x, .x == "x", NA_character_)),
count_inng = pmap_dbl(cur_data(), ~ sum(!is.na(c(...)))),
sums_inng = pmap_dbl(select(cur_data(), starts_with("inng")),
~ sum(as.numeric(c(...)), na.rm = TRUE)))
)
team linescore ondate inng1 inng2 inng3 inng4 inng5 inng6 inng7 inng8 inng9 count_inng
1 NYM 010000000 2020-08-01 0 1 0 0 0 0 0 0 0 9
2 NYM (10)1140006x 2020-08-02 10 1 1 4 0 0 0 6 <NA> 8
3 BOS 002200010 2020-08-13 0 0 2 2 0 0 0 1 0 9
4 NYM 00000(11)01x 2020-08-15 0 0 0 0 0 11 0 1 <NA> 8
5 BOS 311200 2020-08-20 3 1 1 2 0 0 <NA> <NA> <NA> 6
sums_inng
1 1
2 22
3 5
4 12
5 7
解决方案01
我对我的解决方案进行了一些修改,因为它错误地替换了输出向量中的两位数,我认为它已经修复。我认为这个解决方案可能会对您有所帮助。为此,我决定编写一个自定义函数来检测两位数并修剪分数的输出:
library(dplyr)
library(stringr)
library(tidyr)
library(purrr)
fn <- function(x) {
out <- c()
if(str_detect(x, "\\((\\d){2}\\)")) {
double <- str_replace_all(str_extract(x, "\\((\\d){2}\\)"), "[)()]", "")
ind <- str_locate(x, "\\(")
x <- str_remove(x, "\\((\\d){2}\\)")
out <- c(out, str_split(x, "")[[1]])
out[(ind[1, 1]+1):(length(out)+1)] <- out[(ind[1, 1]):length(out)]
out[ind] <- double
} else {
out <- c(out, str_split(x, "")[[1]])
}
if(any(grepl(")", out))) {
out <- out[-which(out == ")")]
}
out
}
# Test
fn("(10)1140006x)")
[1] "10" "1" "1" "4" "0" "0" "0" "6" "x"
然后我们以逐行操作将其应用于我们的数据集:
df %>%
mutate(linescore = map(linescore, fn)) %>%
unnest_wider(linescore) %>%
rename_with(~ gsub("(\\.\\.\\.)(\\d)", paste0("inng", "\\2"), .), starts_with("...")) %>%
mutate(across(starts_with("inng"), ~ {replace(.x, .x == "x", NA)
as.numeric(.x)}),
inns_count = pmap_dbl(select(cur_data(), starts_with("inng")),
~ sum(!is.na(c(...)))),
inns_sums = pmap_dbl(select(cur_data(), starts_with("inng")),
~ sum(c(...), na.rm = TRUE)))
# A tibble: 5 x 13
team inng1 inng2 inng3 inng4 inng5 inng6 inng7 inng8 inng9 ondate inns_count inns_sums
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <date> <dbl> <dbl>
1 NYM 0 1 0 0 0 0 0 0 0 2020-08-01 9 1
2 NYM 10 1 1 4 0 0 0 6 NA 2020-08-02 8 22
3 BOS 0 0 2 2 0 0 0 1 0 2020-08-13 9 5
4 NYM 0 0 0 0 0 11 0 1 NA 2020-08-15 8 12
5 BOS 3 1 1 2 0 0 NA NA NA 2020-08-20 6 7
关于r - 需要使用 R 从字符串列中提取单个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68593699/
我正在做一个业余爱好项目,使用 Ruby、PHP 或 Java 来抓取 ASP.net 网站的内容。例如,如果网站 url“www.myaspnet.com/home.aspx”。我想从 home.a
如果我有这些字符串: mystrings <- c("X2/D2/F4", "X10/D9/F4", "X3/D22/F4",
我有以下数据集 > head(names$SAMPLE_ID) [1] "Bacteria|Proteobacteria|Gammaproteobacteria|Pseudomonadales|Mor
设置: 3个域类A,B和C。A和B在插件中。 C在依赖于此插件的应用程序中。 class A{ B b static mapping = { b fetch: 'joi
我不知道如何提取 XML 文件中的开始标记元素名称。我很接近〜意味着没有错误,我正在获取标签名称,但我正在获取标签名称加上信息。我得到的是: {http://www.publishing.org}au
我有一个字符串 x <- "Name of the Student? Michael Sneider" 我想从中提取“Michael Sneider”。 我用过: str_extract_all(x,
我有一个如下所示的文本文件: [* content I want *] [ more content ] 我想读取该文件并能够提取我想要的内容。我能做的最好的事情如下,但它会返回 [更多内容] 请注意
假设我有一个项目集合 $collection = array( 'item1' => array( 'post' => $post, 'ca
我正在寻找一种过滤文本文件的方法。我有许多文件夹名称,其中包含许多文本文件,文本文件有几个没有人员,每个人员有 10 个群集/组(我在这里只显示了 3 个)。但是每个组/簇可能包含几个原语(我在这里展
我已经编写了一个从某个网页中提取网址的代码,我面临的问题是它不会以网页上相同的方式提取网址,我的意思是如果该网址位于某些网页中法语,它不会按原样提取它。我该如何解决这个问题? import reque
如何在 C# 中提取 ZipFile?(ZipFile 是包含文件和目录) 最佳答案 为此使用工具。类似于 SharpZip .据我所知 - .NET 不支持开箱即用的 ZIP 文件。 来自 here
我有一个表达: [training_width]:lofmimics 我要提取[]之间的内容,在上面的例子中我要 training_width 我试过以下方法: QRegularExpression
我正在尝试创建一个 Bash 脚本,该脚本将从命令行给出的最后一个参数提取到一个变量中以供其他地方使用。这是我正在处理的脚本: #!/bin/bash # compact - archive and
我正在寻找一个 JavaScript 函数/正则表达式来从 URI 中提取 *.com...(在客户端完成) 它应该适用于以下情况: siphone.com = siphone.com qwr.sip
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
编辑:添加了实际的 JSON 对象和代码以供审查 我有这种格式的 JSON(只是这种层次结构,假设 JSON 正常工作) {u'kind': u'calendar#events', u'default
我已经编写了代码来使用 BeautifulSoup 提取一本书的 url 和标题来自页面。 但它并没有在 > 之间提取惊人的 super 科学故事 1930 年 4 月这本书的名字。和 标签。 如何提
使用 Java,我想提取美元符号 $ 之间的单词。 例如: String = " this is first attribute $color$. this is the second attribu
您好,我正在尝试找到一种方法来确定字符串中的常量,然后提取该常量左侧的一定数量的字符。 例如-我有一个 .txt 文件,在那个文件的某处有数字 00nnn 数字的例子是 00234 00765 ...
php读取zip文件(删除文件,提取文件,增加文件)实例 从zip压缩文件中提取文件 复制代码 代码如下: <?php /* php 从zip压缩文件
我是一名优秀的程序员,十分优秀!