【问题标题】:R Data Frame Manipulation - Replacing Elements of df2 with the Corresponding Row from df1R 数据框操作 - 用 df1 中的相应行替换 df2 的元素
【发布时间】:2021-01-19 14:24:42
【问题描述】:

我有两个数据框,df1df2。我想用df1 中的相应行替换df2 中的每个元素。见下文:

> df1
  V1 V2 V3 V4 V5 V6
1  7 11 22 35 36 37
2  6 14 17 18 32 38
3  9 17 21 24 33 37

df2
V1 V2 V3
1  1 NA NA
2  2 NA NA
3  3 NA NA
4  1  2 NA
5  1  3 NA
6  2  3 NA
7  1  2  3

通过使用以下代码行,我可以非常接近所需的输出:df1[t(df2),],它会生成以下输出:

> df1[t(df2),]
     V1 V2 V3 V4 V5 V6
1     7 11 22 35 36 37
NA   NA NA NA NA NA NA
NA.1 NA NA NA NA NA NA
2     6 14 17 18 32 38
NA.2 NA NA NA NA NA NA
NA.3 NA NA NA NA NA NA
3     9 17 21 24 33 37
NA.4 NA NA NA NA NA NA
NA.5 NA NA NA NA NA NA
1.1   7 11 22 35 36 37
2.1   6 14 17 18 32 38
NA.6 NA NA NA NA NA NA
1.2   7 11 22 35 36 37
3.1   9 17 21 24 33 37
NA.7 NA NA NA NA NA NA
2.2   6 14 17 18 32 38
3.2   9 17 21 24 33 37
NA.8 NA NA NA NA NA NA 
1.3   7 11 22 35 36 37
2.3   6 14 17 18 32 38
3.3   9 17 21 24 33 37

但是,我希望输出保留与 df2 (nrow = 7, ncol = 18) 相同数量的行,并如下所示:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
[1,]    7   11   37   35   36   37   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
[2,]    6   14   32   32   32   38   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
[3,]    9   17   21   24   33   37   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
[4,]    7   11   37   35   36   37    6   14   32    32    32    38    NA    NA    NA    NA    NA    NA
[5,]    7   11   37   35   36   37    9   17   21    24    33    37    NA    NA    NA    NA    NA    NA
[6,]    6   14   32   32   32   38    9   17   21    24    33    37    NA    NA    NA    NA    NA    NA
[7,]    7   11   37   35   36   37    6   14   32    32    32    38     9    17    21    24    33    37

【问题讨论】:

  • 图片不是发布数据(或代码)的好方法。 Relevant xkcd。您可以以dput 格式发布示例数据吗?请使用您尝试过的代码和dput(df) 的输出来编辑问题。或者,如果 dput(head(df, 20)) 的输出太大。 (注意:df 应同时替换为df1df2
  • 怎么样:t(apply(df2, 1, function(x) t(df1[x,])))
  • 您想要的输出中的ncol = 18 来自哪里?

标签: r dataframe data-manipulation


【解决方案1】:

您可以使用lapplydf2 的列进行迭代,并使用sapplydf1 的列进行迭代,对这些值进行子集化,最终得到组合矩阵。

unname(do.call(cbind, lapply(df2, function(x) sapply(df1, function(y) y[x]))))

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
#[1,]    7   11   22   35   36   37   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
#[2,]    6   14   17   18   32   38   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
#[3,]    9   17   21   24   33   37   NA   NA   NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
#[4,]    7   11   22   35   36   37    6   14   17    18    32    38    NA    NA    NA    NA    NA    NA
#[5,]    7   11   22   35   36   37    9   17   21    24    33    37    NA    NA    NA    NA    NA    NA
#[6,]    6   14   17   18   32   38    9   17   21    24    33    37    NA    NA    NA    NA    NA    NA
#[7,]    7   11   22   35   36   37    6   14   17    18    32    38     9    17    21    24    33    37

数据

df1 <- structure(list(V1 = c(7L, 6L, 9L), V2 = c(11L, 14L, 17L), V3 = c(22L, 
17L, 21L), V4 = c(35L, 18L, 24L), V5 = c(36L, 32L, 33L), V6 = c(37L, 
38L, 37L)), class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(V1 = c(1L, 2L, 3L, 1L, 1L, 2L, 1L), V2 = c(NA, 
NA, NA, 2L, 3L, 3L, 2L), V3 = c(NA, NA, NA, NA, NA, NA, 3L)), 
class = "data.frame", row.names = c(NA, -7L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-01
    • 2017-02-06
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2020-09-20
    相关资源
    最近更新 更多