【问题标题】:Combine column to remove NA's yet prioritize specific replacements合并列以删除 NA,但优先考虑特定替换
【发布时间】:2017-04-14 04:52:54
【问题描述】:

我正在学习使用this previous post 更新列数据。但是,是否有一个技巧可以指定在发生冲突时哪一列应该提供最终更新的值。例如,只要每行只存在一个值,我就可以合并数据列:

data <- data.frame('a' = c('A','B','C','D','E'),
    'x' = c(NA,NA,3,NA,NA),
    'y' = c(1,2,NA,NA,NA),
    'z' = c(NA,NA,NA,4,5))
cbind.data.frame(data3[1], mycol=c(na.omit(c(t(data3[, -1])))))

在以下情况下,我将如何强制值来自 newVal

data <- data.frame('a' = c('A','B','C','D','E','F'),
                   'x' = c(NA,NA,NA,3,NA,NA),
                   'y' = c(1,2,8,NA,NA,NA),
                   'z' = c(99,NA,4,NA,4,5))

【问题讨论】:

    标签: r dataframe updates overwrite


    【解决方案1】:

    使用max.col 和一些矩阵索引(指定要采用的行/列组合):

    cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))
    #     [,1] [,2]
    #[1,]    1    3
    #[2,]    2    2
    #[3,]    3    3
    #[4,]    4    1
    #[5,]    5    3
    #[6,]    6    3
    
    data[-1][cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))]
    #[1] 99  2  4  3  4  5
    
    cbind(data[1], result=data[-1][cbind(1:nrow(data), max.col(!is.na(data[-1]), "last"))])
    #  a result
    #1 A     99
    #2 B      2
    #3 C      4
    #4 D      3
    #5 E      4
    #6 F      5
    

    如果您需要始终为特定列提供优先级,请按特定顺序创建一个包含列的临时对象,然后对其进行处理:

    tmp <- data[-1][c("z", setdiff(names(data[-1]), "z"))]
    tmp[cbind(1:nrow(tmp), max.col(!is.na(tmp), "first"))]
    #[1] 99  2  4  3  4  5
    

    【讨论】:

    • 我更新了我的示例,以避免我们只在最后一列中查找最大值的琐碎情况;它可能大于或小于。
    • @val - 代码没有选择最大值,而是选择了列中最后一个非NA 值。它可能不是数字最大值。您是否尝试过代码?
    • 我明白了。谢谢。有没有办法指定列 hte 值应该来自哪里?
    • @val - 你可以创建一个像 data[-1][c("z", setdiff(names(data[-1]), "z"))] 这样的临时数据集,它将键列放在首位,然后查找 "first" 非 NA 值。
    • 好的...必须慢慢阅读才能理解。为什么对你的答案投反对票?
    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 2021-06-06
    • 1970-01-01
    • 2017-01-08
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多