【问题标题】:Copying a substring to a string below, conditional on the contents of both strings将子字符串复制到下面的字符串,以两个字符串的内容为条件
【发布时间】:2020-09-07 20:34:51
【问题描述】:

我的数据如下所示:

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 将子字符串粘贴到: 之前的字符串之前。但我不知道如何写这样的东西..

【问题讨论】:

    标签: r string if-statement concatenation paste


    【解决方案1】:

    你可以这样做:

    #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')
    

    【讨论】:

    • 哇,这是一个非常好的解决方案。非常感谢!
    【解决方案2】:

    可能的解决方案之一

    #Sample data
    
    Sno <- c(1:8)
    Values <- c("Number of returns", "Number of joint returns", "Salaries and wages in AGI: [4] Number", "Amount", "Taxable interest:  Number", "Amount", "Ordinary dividends:  Number", "Amount")
    df <- data.frame(Sno, Values, stringsAsFactors = FALSE)
    
    df
    
    #  Sno                               Values
    #   1                     Number of returns
    #   2               Number of joint returns
    #   3 Salaries and wages in AGI: [4] Number
    #   4                                Amount
    #   5             Taxable interest:  Number
    #   6                                Amount
    #   7           Ordinary dividends:  Number
    #   8                                Amount
    
    for(i in 2:nrow(df)){
        if(df[i,2]=="Amount" && grepl("Number",df[i-1,2])){
            df[i,2] <- paste0(strsplit(df[i-1,2],":", fixed = TRUE)[[1]][[1]],": ",df[i,2])
        }
    }
    
    #Updated dataframe
    
    # Sno                                Values
    #   1                     Number of returns
    #   2               Number of joint returns
    #   3 Salaries and wages in AGI: [4] Number
    #   4     Salaries and wages in AGI: Amount
    #   5             Taxable interest:  Number
    #   6              Taxable interest: Amount
    #   7           Ordinary dividends:  Number
    #   8            Ordinary dividends: Amount
    
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 2014-08-03
      • 2017-10-18
      • 1970-01-01
      相关资源
      最近更新 更多