【问题标题】:Add specific values from a dataframe to a specific location in a matrix将数据框中的特定值添加到矩阵中的特定位置
【发布时间】:2018-05-03 21:51:33
【问题描述】:

我想将存储在数据框中的值添加到矩阵中它们所属的位置。

这是数据:

数据框:

  df <- read.table(text=' A B C
   name1  add1  1       
   name2  add1  2 
   name3  add1  3
   name1  add2  1       
   name2  add2  2 ',   header=TRUE)
    > df
      A    B C
1 name1 add1 1
2 name2 add1 2
3 name3 add1 3
4 name1 add2 1
5 name2 add2 2

矩阵:

ma <- matrix(NA, ncol=2, nrow=3)
colnames(ma)<-c('add1', 'add2')
rownames(ma)<-c('name1', 'name2', 'name3')
> ma
      add1 add2
name1   NA   NA
name2   NA   NA
name3   NA   NA

所以df$A 中的唯一条目是ma 的行 df$B 中的唯一条目是ma 的列

生成的矩阵如下所示:

> ma
      add1 add2
name1    1    1
name2    2    2
name3    3    NA

请注意,数据框可以按任意顺序排列,并且某些名称和添加的组合可能不存在(因此ma 中仍应有一个NA

到目前为止,我无法生成工作代码来从df 中取出值并将它们写入ma

非常感谢您的建议。

谢谢!

【问题讨论】:

  • tidyr::spread(df, B, C)
  • @KevinRoth。在已经有答案(和接受的答案)之后,请尽量不要编辑您的示例数据和预期输出。对于那些第一次查看帖子的人来说,这些答案看起来不正确。

标签: r dataframe matrix subset


【解决方案1】:

如果我正确理解您的问题,那只是将数据从“长格式”转换为“宽格式”。这可以通过使用包reshape2 轻松实现。

library(reshape2)

dcast(df, A ~ B)
#        A add1 add2
# 1 name1    1    1
# 2 name2    2    2
# 3 name3    3    3

【讨论】:

  • 谢谢你。这可以正常工作,但是如果 name 和 add 的组合不存在,我会遇到问题。这方面的问题不清楚,我修改一下。
  • 它实际上会在数据丢失的地方创建 NA。非常简单的解决方案,谢谢!
  • 也请看@user 或@Matt W 的回答。reshape2 包是tidyr 包的先例,参见here。在简单的情况下tidyr 可能更好,只有在更复杂的情况下你可能不得不转向reshape2。我只是习惯了那个:-)。
  • 还要注意dcastmelt在导入包时与data.table有很好的集成。
【解决方案2】:

无需创建一个空矩阵,然后填写值,只需重塑您原来的df。即使您有 NA 组合,以下内容也可以使用:

library(tidyr)

spread(df, B, C)

结果:

      A add1 add2
1 name1    1   NA
2 name2   NA    2
3 name3    3    3

或者如果您更喜欢矩阵:

library(tidyverse)

df %>%
  spread(B, C) %>%
  remove_rownames() %>%
  column_to_rownames("A") %>%
  as.matrix()

结果:

      add1 add2
name1    1   NA
name2   NA    2
name3    3    3

数据:

df <- read.table(text=' A B C
                 name1  add1  1       
                 name2  add1  NA 
                 name3  add1  3
                 name1  add2  NA       
                 name2  add2  2 
                 name3  add2  3',   header=TRUE)

【讨论】:

  • 谢谢! @Manuel Bickel 已经提供了一个可行的解决方案,但是有更多的选择很棒:)
【解决方案3】:

您可以使用tidyr 中的spread 函数完成此操作

library(tidyr)

spread(df, B, C)

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2013-04-21
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多