r - 将子字符串复制到下面的字符串,以两个字符串的内容为条件
问题描述
我的数据看起来像这样:
A toberevised
8: <NA>
9: <NA>
10: Number of returns
11: Number of joint returns
12: Number with paid preparer's signature
13: Number of exemptions
14: Adjusted gross income (AGI) [3]
14: Adjusted gross income (AGI) [3]
**15: Salaries and wages in AGI: [4] Number
16: Amount
17: Taxable interest: Number
18: Amount
19: Ordinary dividends: Number
20: Amount**
21: <NA>
22: <NA>
23: Number of returns
24: Number of joint returns
25: Number with paid preparer's signature
26: Number of exemptions
DF <- structure(list(toberevised = c("[Money amounts are in thousands of dollars]",
NA, NA, NA, "Item", NA, NA, NA, NA, "Number of returns", "Number of joint returns",
"Number with paid preparer's signature", "Number of exemptions",
"Adjusted gross income (AGI) [3]", "Salaries and wages in AGI: [4] Number",
"Amount", "Taxable interest: Number", "Amount", "Ordinary dividends: Number",
"Amount")), row.names = c(NA, -20L), class = c("data.table",
"data.frame"))
我想编写一段代码,在其他行之前复制第:
15、17 和 19 行之前的部分Amount
,所以:
A toberevised
8: <NA>
9: <NA>
10: Number of returns
11: Number of joint returns
12: Number with paid preparer's signature
13: Number of exemptions
14: Adjusted gross income (AGI) [3]
**15: Salaries and wages in AGI: [4] Number
16: Salaries and wages in AGI: Amount
17: Taxable interest: Number
18: Taxable interest: Amount
19: Ordinary dividends: Number
20: Ordinary dividends: Amount**
21: <NA>
22: <NA>
23: Number of returns
24: Number of joint returns
25: Number with paid preparer's signature
26: Number of exemptions
我尝试了一些非常笨拙的解决方案,例如将必须的单元格复制:
到新列,填充该列,然后尝试Number
从该列中删除,之后我可以连接这些列,之后我必须删除所有的 debree。
DF <- setDT(DF)[grepl(":", DF$toberevised), type:=toberevised]
DF$type <- na.locf(DF$type, na.rm=FALSE)
DF$type <- gsub("[[:punct:]]*Number[[:punct:]]*", "", DF$type)
DF$fullname <- paste(DF$type,DF$toberevised)
除了它不起作用之外,它也有点麻烦。
有什么更好的方法来做到这一点?我正在考虑检查一个单元格是否有: Number
并且下面的单元格是否在下面Amount
的字符串之前粘贴了子:
字符串。但我不知道如何写这样的东西..
解决方案
你可以做 :
#Get the index of row where current row has "Amount" and previous had "Number"
library(data.table)
inds <- which(DF$toberevised == 'Amount' & shift(grepl('Number', DF$toberevised)))
#Paste those rows with revised value from previous row.
DF$toberevised[inds] <- paste0(sub(':.*', '', DF$toberevised[inds - 1]),
': Amount')
推荐阅读
- c# - 即使在侦听器关闭后,C# HttpListener getContext 方法也会继续阻塞
- google-apps-script - 无法获取由谷歌驱动器上的另一个应用程序脚本创建的文件夹
- java - Spring Reactive Web 更新方法创建新记录而不是更新现有记录
- cpu-architecture - 给定某个内存位置的二进制模式,是否可以判断该模式代表机器指令还是数字?
- docker - 如何在 Heroku 上为 Docker 设置动态环境变量?
- java - 下载springframework源码导入idea成功,创建测试模块,依赖不生效
- excel - 在不同的应用程序中关闭工作簿后,一些实例仍然存在
- mysql - 错误:用户 'root'@'localhost' 的访问被拒绝(使用密码:是)
- bash - 捕获和平均 ping 时间
- math - 查找长度为 x2-x1 的多边形和水平线段之间的交点数