【发布时间】:2023-03-16 05:41:01
【问题描述】:
背景
下面是我的 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,"[()]")
这是我收到的错误消息:
“stri_replace_all_regex(string, pattern, fix_replacement(replacement), : object 'inng1' not found”中的错误”
第三,我需要知道如何提取每个附加局的得分,从第二局开始,将每个值放在自己的列中,例如 inng2、inng3 等等。
最后,我应该有上面显示的输出(每个两位数的局都没有括号),每个局都有一列,所以会有一个标题为“inng1”、“inng2”、“inng3”、“ inng4",以此类推。局列中的数据需要是数字,稍后我将对其进行求和。
【问题讨论】:
-
inng1 列包含每个观察值的“linescore”列中的第一个值。 inng2 列包含每个观察值的“linescore”列中的第二个值,依此类推。括号中的数字算作一个值。
-
你能告诉我任何字符串中的两个右括号是什么意思吗?额外的右括号是否总是后跟
x? -
AnilGoyal,如果您指的是第二个观察值中的行得分中的最后一个括号,那是一个错误。 'x' 后面不应该有括号。
-
是的,我只是指那个。看我的回答。请检查。如果这有效,我会添加适当的解释。
-
我认为必须删除,因为 OP 已经声明他想要数字输出