【发布时间】:2016-04-09 12:58:32
【问题描述】:
在以下示例中,res 有 90 行和 6 列,并包含多个 NA。还有一个矩阵,tmpCombs,有 6 行 2 列。 tmpCombs的每一行对应res中的一组15行(6*15=90)。它的列数 (2) 意味着我必须用指定的字符(比如“B”)替换 res 的每一行中的 2 个现有 NA。 (保证每行至少有2个NA)。
例如,tmpCombs 的第 5 行中的值 2 和 4 意味着对于 res 的组 61-75 (4*15+1):(5*15) 中的每一行,出现的第 2 和第 4 个 NA 必须替换为“B” .
我可以使用嵌套的 for 循环来完成这项工作,但我正在寻找一种更快/更大规模的方法来执行这些替换(可能使用 dplyr 或 data.table),因为我的代码变得越来越慢,因为尺寸增加。
下面给出了res 和tmpCombs 的示例。还有第二个数据帧res2,其中包含所需的输出。
res <- structure(list(X1 = c("A", "A", "A", "A", "A", NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A", NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A", NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A", NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A",
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "A", "A", "A", "A", "A",
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), X2 = c("A", NA, NA,
NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A", NA,
NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A",
NA, NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A",
NA, NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A",
NA, NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA, "A",
NA, NA, NA, NA, "A", "A", "A", "A", NA, NA, NA, NA, NA, NA),
X3 = c(NA, "A", NA, NA, NA, "A", NA, NA, NA, "A", "A", "A",
NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, NA, "A", "A",
"A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, NA, "A",
"A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, NA,
"A", "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA,
NA, NA, "A", "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A",
NA, NA, NA, "A", "A", "A", NA, NA, NA), X4 = c(NA, NA, "A",
NA, NA, NA, "A", NA, NA, "A", NA, NA, "A", "A", NA, NA, NA,
"A", NA, NA, NA, "A", NA, NA, "A", NA, NA, "A", "A", NA,
NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, NA, "A", "A",
NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, NA, "A",
"A", NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, NA,
"A", "A", NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, "A",
NA, NA, "A", "A", NA), X5 = c(NA, NA, NA, "A", NA, NA, NA,
"A", NA, NA, "A", NA, "A", NA, "A", NA, NA, NA, "A", NA,
NA, NA, "A", NA, NA, "A", NA, "A", NA, "A", NA, NA, NA, "A",
NA, NA, NA, "A", NA, NA, "A", NA, "A", NA, "A", NA, NA, NA,
"A", NA, NA, NA, "A", NA, NA, "A", NA, "A", NA, "A", NA,
NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, "A", NA, "A",
NA, NA, NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, "A", NA,
"A"), X6 = c(NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA,
"A", NA, "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A",
NA, NA, "A", NA, "A", "A", NA, NA, NA, NA, "A", NA, NA, NA,
"A", NA, NA, "A", NA, "A", "A", NA, NA, NA, NA, "A", NA,
NA, NA, "A", NA, NA, "A", NA, "A", "A", NA, NA, NA, NA, "A",
NA, NA, NA, "A", NA, NA, "A", NA, "A", "A", NA, NA, NA, NA,
"A", NA, NA, NA, "A", NA, NA, "A", NA, "A", "A")), .Names = c("X1",
"X2", "X3", "X4", "X5", "X6"), row.names = c(NA, -90L), class = "data.frame")
tmpCombs <- structure(c(1L, 1L, 1L, 2L, 2L, 3L, 2L, 3L, 4L, 3L, 4L, 4L), .Dim = c(6L,
2L))
res2 <- structure(list(X1 = c("A", "A", "A", "A", "A", "B", "B", "B",
"B", "B", "B", "B", "B", "B", "B", "A", "A", "A", "A", "A", "B",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "A", "A", "A", "A",
"A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "A", "A",
"A", "A", "A", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "A", "A",
"A", "A", "A", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "A", "A",
"A", "A", "A", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), X2 = c("A",
"B", "B", "B", "B", "A", "A", "A", "A", "B", "B", "B", "B", "B",
"B", "A", "B", "B", "B", "B", "A", "A", "A", "A", NA, NA, NA,
NA, NA, NA, "A", "B", "B", "B", "B", "A", "A", "A", "A", NA,
NA, NA, NA, NA, NA, "A", NA, NA, NA, NA, "A", "A", "A", "A",
"B", "B", "B", "B", "B", "B", "A", NA, NA, NA, NA, "A", "A",
"A", "A", "B", "B", "B", "B", "B", "B", "A", NA, NA, NA, NA,
"A", "A", "A", "A", NA, NA, NA, NA, NA, NA), X3 = c("B", "A",
"B", "B", "B", "A", "B", "B", "B", "A", "A", "A", NA, NA, NA,
"B", "A", NA, NA, NA, "A", NA, NA, NA, "A", "A", "A", "B", "B",
"B", "B", "A", NA, NA, NA, "A", NA, NA, NA, "A", "A", "A", NA,
NA, NA, NA, "A", "B", "B", "B", "A", "B", "B", "B", "A", "A",
"A", "B", "B", "B", NA, "A", "B", "B", "B", "A", "B", "B", "B",
"A", "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA,
NA, "A", "A", "A", "B", "B", "B"), X4 = c("B", "B", "A", NA,
NA, "B", "A", NA, NA, "A", NA, NA, "A", "A", NA, NA, NA, "A",
"B", "B", NA, "A", "B", "B", "A", "B", "B", "A", "A", NA, NA,
NA, "A", NA, NA, NA, "A", NA, NA, "A", NA, NA, "A", "A", "B",
"B", "B", "A", "B", "B", "B", "A", "B", "B", "A", "B", "B", "A",
"A", NA, "B", "B", "A", NA, NA, "B", "A", NA, NA, "A", NA, NA,
"A", "A", "B", NA, NA, "A", "B", "B", NA, "A", "B", "B", "A",
"B", "B", "A", "A", "B"), X5 = c(NA, NA, NA, "A", NA, NA, NA,
"A", NA, NA, "A", NA, "A", NA, "A", "B", "B", "B", "A", NA, "B",
"B", "A", NA, "B", "A", NA, "A", NA, "A", NA, NA, NA, "A", "B",
NA, NA, "A", "B", NA, "A", "B", "A", "B", "A", "B", "B", "B",
"A", NA, "B", "B", "A", NA, "B", "A", NA, "A", NA, "A", NA, NA,
NA, "A", "B", NA, NA, "A", "B", NA, "A", "B", "A", "B", "A",
"B", "B", "B", "A", "B", "B", "B", "A", "B", "B", "A", "B", "A",
"B", "A"), X6 = c(NA, NA, NA, NA, "A", NA, NA, NA, "A", NA, NA,
"A", NA, "A", "A", NA, NA, NA, NA, "A", NA, NA, NA, "A", NA,
NA, "A", NA, "A", "A", "B", "B", "B", "B", "A", "B", "B", "B",
"A", "B", "B", "A", "B", "A", "A", NA, NA, NA, NA, "A", NA, NA,
NA, "A", NA, NA, "A", NA, "A", "A", "B", "B", "B", "B", "A",
"B", "B", "B", "A", "B", "B", "A", "B", "A", "A", "B", "B", "B",
"B", "A", "B", "B", "B", "A", "B", "B", "A", "B", "A", "A")), .Names = c("X1",
"X2", "X3", "X4", "X5", "X6"), row.names = c(NA, -90L), class = "data.frame")
【问题讨论】:
标签: r performance loops