【问题标题】:replace NAs in columns with values of new data set (that has identically named columns) in R用 R 中的新数据集(具有相同名称的列)的值替换列中的 NA
【发布时间】:2016-03-14 08:55:25
【问题描述】:

我有两个数据集(data2012 和 data2013),它们共享一些同名的行 (ID) 和列(个体特征、数字和公制)。 Data2012 在 data2013 具有 NA 的行中具有值,反之亦然。

如果行名(ID)和列名(个体特征)相同,我想用 data2013 中的相应值替换 data2012 中的 NA。如果 data2012 有 NA 并且 data2013 有值,我只想用 data2013 替换 data2012。

(由于两个数据集有超过 200 个相同名称的列,我无法在代码中单独列出每一列。此外,列的顺序也不相同。我需要一个代码来利用列和行 - 需要替换的值 - 具有完全相同的名称。)

我理想的最终产品: 一个数据集,每个 ID(行)都有一些来自 data2012 的特征(列),一些来自 data2013 和一些剩余的 NA(如果两个数据集都没有相应的值)。

data2012

     x2  x4  x5  x6  x7  x9
id1  NA  NA  2   NA  4   NA
id2  1   NA  NA  NA  NA  1
id5  NA  3   5   NA  NA  NA
id6  NA  NA  NA  NA  NA  NA

data2013(在 id2 和 id6 中有额外信息)

     x2  x4  x5  x7 
id2  NA  NA  4  NA  
id3  1   NA  2   NA
id4  NA  9   NA  5
id6  1   NA  2   8

理想的最终产品

     x2  x4  x5  x6  x7  x9
id1  NA  NA  2   NA  4   NA
id2  1   NA  4   NA  NA  1
id5  NA  3   5   NA  NA  NA
id6  1   NA  2   NA  8   NA

我希望你们能帮助我。谢谢!

【问题讨论】:

  • 分享数据,而不是描述它。
  • 使用dput(head(data2012))dput(head(data2013)) 的输出编辑您的问题(或至少有足够的数据来重现您的问题)
  • 使用match 匹配两个数据集中的行名/列名以及is.na 将一个数据集中的NA 值替换为另一个。
  • 您好,感谢您的快速回复。我刚刚添加了一些数据,希望能让我的问题/问题更清楚。
  • @mtoto:我刚刚添加了一些数据,对你有帮助吗?

标签: r na economics


【解决方案1】:

我们可以使用match获取相应数据集的列/行索引,对数据集进行子集化,然后将一个值分配给另一个

j1 <- match(colnames(data2012), colnames(data2013), nomatch=0)
j2 <- match(colnames(data2013), colnames(data2012), nomatch=0)
i1 <- match(rownames(data2012), rownames(data2013), nomatch=0)
i2 <- match(rownames(data2013), rownames(data2012), nomatch=0)

m1 <- do.call(pmax, c(list(as.matrix(data2012[i2,j2]), 
        as.matrix(data2013[i1,j1])), list(na.rm=TRUE)))
data2012[i2,j2] <- m1
data2012
#    x2 x4 x5 x6 x7 x9
#id1 NA NA  2 NA  4 NA
#id2  1 NA  4 NA NA  1
#id5 NA  3  5 NA NA NA
#id6  1 NA  2 NA  8 NA

数据

data2012 <- structure(list(x2 = c(NA, 1L, NA, NA), 
x4 = c(NA, NA, 3L, NA), 
x5 = c(2L, NA, 5L, NA), x6 = c(NA, NA, NA, NA), x7 = c(4L, 
 NA, NA, NA), x9 = c(NA, 1L, NA, NA)), .Names = c("x2", "x4", 
"x5", "x6", "x7", "x9"), class = "data.frame",
 row.names = c("id1", "id2", "id5", "id6"))

data2013 <- structure(list(x2 = c(NA, 1L, NA, 1L),
 x4 = c(NA, NA, 9L, NA), 
x5 = c(4L, 2L, NA, 2L), x7 = c(NA, NA, 5L, 8L)), .Names = c("x2", 
"x4", "x5", "x7"), class = "data.frame", 
row.names = c("id2", "id3", "id4", "id6"))

【讨论】:

    猜你喜欢
    • 2015-07-28
    • 2023-02-24
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多