【问题标题】:How to replace every column value with the value of the next column based on a condition如何根据条件将每一列的值替换为下一列的值
【发布时间】:2020-07-23 11:39:31
【问题描述】:

我首先应该承认,我真的很难为我所面临的复杂问题找到一个合适的标题。

我有以下数据:

        configuration_id     TARGET_CLASS                 UniqueIdentifier  BranchCoverage  Total_Branches  Size    Length  Generations Statements_Executed CoverageTimeline_T1 CoverageTimeline_T2 CoverageTimeline_T3
        ar_statement         com.browsersoft.aacs.User  NA                67559dfd        1               60      46        108          NA                 108                 0.8158776539          0.8381375035
        ar_statement         com.browsersoft.aacs.User  efe4cbdc            1                 60                44    103       240          1087446              0.7525773196        0.7540513682        0.7661337337
        ar_statement         com.browsersoft.aacs.User  NA                aac8afa6        1               60      43        104          NA                 177                 0.765031271         0.8062749834
        ar_statement         com.browsersoft.aacs.User  8567c4bd            1                 60                45    105       388          NA                 0.8680720145          0.9386218251        0.9484536082
        ar_statement         com.browsersoft.aacs.User  94e45912            1                 60                43    101       118          NA                 0.8767466262          0.9471901622        0.9690721649

如您所见,UniqueIdentifier 列中有 NA。 NA 将同一行中的值推到右侧;正确的值在右栏中。我想要的是删除 NA 并将其替换为下一列值,例如:

    configuration_id     TARGET_CLASS                 UniqueIdentifier  BranchCoverage  Total_Branches  Size    Length  Generations Statements_Executed CoverageTimeline_T1 CoverageTimeline_T2 CoverageTimeline_T3
    ar_statement         com.browsersoft.aacs.User  67559dfd            1                 60                46      108     108          NA                 0.8158776539          0.8381375035
    ar_statement         com.browsersoft.aacs.User  efe4cbdc            1                 60                44      103     240          1087446              0.7525773196        0.7540513682        0.7661337337
    ar_statement         com.browsersoft.aacs.User  aac8afa6            1                 60                43      104     177          NA                 0.765031271         0.8062749834
    ar_statement         com.browsersoft.aacs.User  8567c4bd            1                 60                45      105     388          NA                 0.8680720145          0.9386218251        0.9484536082
    ar_statement         com.browsersoft.aacs.User  94e45912            1                 60                43      101     118          NA                 0.8767466262          0.9471901622        0.9690721649

为了更清楚,对于那些UniqueIdentifier 为 NA 的行,然后将每一列的值替换为下一列中的值(这就像将值推回)。

我希望我的问题很清楚。

我该怎么做?

【问题讨论】:

标签: r


【解决方案1】:

我想你正在寻找

data$UniqueIdentifier <- dplyr::coalesce(data$UniqueIdentifier, data$BranchCoverage)

或者使用基础 R:

data$UniqueIdentifier <- ifelse(is.na(data$UniqueIdentifier), data$BranchCoverage, data$UniqueIdentifier) 

编辑:您的第一个数据有点难以理解,我看不出是只更改了 BranchCoverage,还是该行中的所有其他值。如果每个值都被推到右边,也许你应该检查你读取数据的方式。但我认为你可以这样解决它:

for (i in 1:nrow(data2)){
  if(is.na(data2$UniqueIdentifier[i])){
    data2[i, 3:ncol(data2)] = c(data2[i, 4:ncol(data2)], NA)
  }   
}

这是一种丑陋的解决方案,但它应该可以工作。

如果它只是 BranchCoverage 并且您想将它的所有值替换为一个,您可以使用 data$BranchCoverage &lt;- 1

另外,感谢 CPak 的评论。

【讨论】:

  • 你也应该添加代码来替换BranchCoverage
猜你喜欢
  • 2019-12-02
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 2015-12-31
相关资源
最近更新 更多