我有以下问题:对于一个Rating,6个数字列中的3个值丢失.

我希望将缺失的值替换为位于具有缺失的值的列左侧的单元格的值.The column names have a clear pattern - they all end with 100, 101 or 102, which can be used as id.

Example:对于Rating 1C、基本Scenario和公司Class,列eePD1中的值缺失. 只有当Class是公司时,才应该用列wePD1中的值来替换它.(零售Class不应被碰).

I.e, the value in eePD1=wePD1 if the value in eePD1 was NA and Class=CORP.

Scenario Rating Class wePD1 wePD2 wePD3 eePD1 eePD2 eePD3
Basic 1C CORP 0.51 0.74 0.43 NA NA NA
Basic 2A CORP 0.41 0.01 0.23 0.37 0.06 0.81
Basic 2B RETAIL 0.68 0.48 0.71 NA NA NA

Desirable result:如果从ee开始的列中单元格的值为NA for the CORP 102 and any 103 and 104,则将NA替换为从we开始且以类似于从ee开始的列名结尾的列的值,例如PD1PD2PD3.

Scenario Rating Class wePD1 wePD2 wePD3 eePD1 eePD2 eePD3
Basic 1C CORP 0.51 0.74 0.43 0.51 0.74 0.43
Basic 2A CORP 0.41 0.01 0.23 0.37 0.06 0.81
Basic 2B RETAIL 0.68 0.48 0.71 NA NA NA

以下是可重现的代码块:

df3=structure(list(Scenario = c("Basic", "Basic", "Basic", "Basic", "Basic"
    ), Rating = c("1C", "2A", "2B", "2C", "3A"), Class = c("CORP", 
    "CORP", "CORP", "CORP", "RETAIL"), wePD1 = c(0.51, 
    0.41, 0.58, 0.28, 
    0.68), wePD2 = c(0.74, 0.01, 
    0.28, 0.92, 0.48
    ), wePD3 = c(0.43, 0.23, 0.04, 
    0.62, 0.71), eePD1 = c(NA, 0.37, 
    0.96, 0.22, NA
    ), eePD2 = c(NA, 0.06, 0.29, 0.22, 
    NA), eePD3 = c(NA, 0.81, 0.85, 
    0.78, NA)), row.names = c(NA, 
    -5L), class = c("data.table", "data.frame"))

第二个解决方案选项是向左数三列,但它是not elegant or generalizable,以防我有更多的列...

到目前为止,我只能找到几个dplyr个示例,可以将值替换为下方/上方的值,但不能替换为侧面的值,或者基于清晰的列名模式以获得更好的通用性,如purrrmap2_int.

推荐答案

假设您只有这些列,下面这样的内容应该就足够了:

df3$eePD1 <- ifelse(is.na(df3$eePD1) & df3$Class == "CORP", df3$wePD1, df3$eePD1)
df3$eePD2 <- ifelse(is.na(df3$eePD2) & df3$Class == "CORP", df3$wePD2, df3$eePD2)
df3$eePD3 <- ifelse(is.na(df3$eePD3) & df3$Class == "CORP", df3$wePD3, df3$eePD3)

之前:

  Scenario Rating  Class wePD1 wePD2 wePD3 eePD1 eePD2 eePD3
1    Basic     1C   CORP  0.51  0.74  0.43    NA    NA    NA
2    Basic     2A   CORP  0.41  0.01  0.23  0.37  0.06  0.81
3    Basic     2B   CORP  0.58  0.28  0.04  0.96  0.29  0.85
4    Basic     2C   CORP  0.28  0.92  0.62  0.22  0.22  0.78
5    Basic     3A RETAIL  0.68  0.48  0.71    NA    NA    NA

之后:

  Scenario Rating  Class wePD1 wePD2 wePD3 eePD1 eePD2 eePD3
1    Basic     1C   CORP  0.51  0.74  0.43  0.51  0.74  0.43
2    Basic     2A   CORP  0.41  0.01  0.23  0.37  0.06  0.81
3    Basic     2B   CORP  0.58  0.28  0.04  0.96  0.29  0.85
4    Basic     2C   CORP  0.28  0.92  0.62  0.22  0.22  0.78
5    Basic     3A RETAIL  0.68  0.48  0.71    NA    NA    NA

如果您有更多遵循此模式的专栏,那么您可能希望对其进行泛化.但对于只有三篇专栏文章,我只会采用这种方法.

更一般的解决方案:

for (target in grep("ee", colnames(df3), value=TRUE)) {
  source <- sub("^ee", "we", target)
  df3[[target]] <- ifelse(
    is.na(df3[[target]]) & df3$Class == "CORP",
    df3[[source]],
    df3[[target]]
  )
}

R相关问答推荐

geom_Ribbon条件填充创建与数据不匹配的形状(ggplot 2 r)

基于现有类创建类的打印方法(即,打印tibles更长时间)

如何对数据集进行逆向工程?

查找图下的面积

将嵌套列表子集化为嵌套列表

如何计算多个日期是否在一个日期范围内

将. xlsx内容显示为HTML表

函数可以跨多个列搜索多个字符串并创建二进制输出变量

使用不同的定性属性定制主成分分析中点的 colored颜色 和形状

如何将一些单元格的内容随机 Select 到一个数据框中?

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

在具有多个响应变量的比例堆叠条形图上方添加总计

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

排序R矩阵的行和列

如何将图例文本添加到图例符号中

在一个multiplot中以非对称的方式在R中绘制多个图

我怎么才能把一盘棋变成一盘棋呢?

从多行中 Select 最小值

如何在GGPlot中控制多个图例和线型

具有某些列的唯一值的数据帧