将列中的NAs替换为R中新数据集(具有相同名称列)的值
我有两个数据集(data2012和data2013),它们共享一些同名的行(ID)和列(单个特征、数字和度量)。Data2012在data2013具有NAs的行中具有值,反之亦然 如果行名称(ID)和列名(单个特征)相同,我想用data2013中的respective值替换data2012中的NAs。如果data2012有NAs且data2013有值,我只想用data2013替换data2012。 (由于这两个数据集有200多个同名列,我无法在代码中分别列出每一列。此外,这些列的顺序也不相同。我需要一个代码,该代码利用以下事实:需要替换值的列和行具有完全相同的名称。) 我理想的最终产品:一个数据集,每个ID(行)都有一些来自data2012的特征(列),一些来自data2013,还有一些NAs(如果两个数据集没有各自的值) data2012将列中的NAs替换为R中新数据集(具有相同名称列)的值,r,na,economics,R,Na,Economics,我有两个数据集(data2012和data2013),它们共享一些同名的行(ID)和列(单个特征、数字和度量)。Data2012在data2013具有NAs的行中具有值,反之亦然 如果行名称(ID)和列名(单个特征)相同,我想用data2013中的respective值替换data2012中的NAs。如果data2012有NAs且data2013有值,我只想用data2013替换data2012。 (由于这两个数据集有200多个同名列,我无法在代码中分别列出每一列。此外,这些列的顺序也不相同。我
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 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
我希望你们能帮助我。谢谢 我们可以使用
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
j1我们可以使用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
j1共享数据,而不是描述数据。使用dput(head(data2012))
和dput(head(data2013))
的输出编辑您的问题(或者至少有足够的数据来重现您的问题)使用match
匹配两个数据集中的行名称/列名,并使用is.na
替换一个数据集中的na值。您好,感谢您的快速回复。我只是添加了一些数据,希望能让我的问题更清楚。@mtoto:我只是添加了一些数据,这对你有帮助吗?分享数据,而不是描述数据。用dput(head(data2012))
和dput(head(data2013))
的输出编辑你的问题(或者至少有足够的数据来重现你的问题)使用match
匹配两个数据集中的行名称/列名,并使用is.na
替换一个数据集中的na值。您好,感谢您的快速回复。我刚刚添加了一些数据,希望这能让我的问题更清楚。@mtoto:我刚刚添加了一些数据,这对你帮助我有帮助吗?
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"))