【问题标题】:R(studio): How to turn a two column df into a matrix? [duplicate]R(工作室):如何将两列df转换为矩阵? [复制]
【发布时间】:2021-05-28 14:28:56
【问题描述】:

我是 R 新手,在这个问题上已经有好几个小时了。我似乎无法在网上找到正确的答案,因此转向你们。我见过的其他 posts 使用 3 列而不是 2 列。

我有一个包含两列的 df:(公司)名称和 ID。 例子df:

Name  id
1 NameA 111
2 NameB 222
3 NameC 111
4 NameD 444
5 NameA 555

我想将此列转换为双模式(发生率)矩阵,其中行名是公司名称,列名是 id 号。期望结果示例:

        111 222 333 444 555
1 NameA  1   0   0   0   1
2 NameB  0   1   0   0   0
3 NameC  1   0   0   0   0
4 NameD  0   0   0   1   0

我尝试了多种形式的 as.matrix 和 data.matrix,但它没有给我正确的格式。也许我做错了。有人可以帮我吗?

(作为奖励:如果可能的话,我想接下来将这两个模式矩阵变成一个模式矩阵。如果有人也知道如何做到这一点,我将永远感激不尽。)


dput 格式的数据

df1 <-
structure(list(Name = c("NameA", "NameB", "NameC", 
"NameD", "NameA"), id = c(111L, 222L, 111L, 444L, 555L)), 
class = "data.frame", row.names = c("1", "2", "3", "4", "5"))

【问题讨论】:

  • 请将您的数据提供为代码,而不是格式化表格。
  • 您可以使用 dput(your_dataframe),并将输出粘贴到您的问题中
  • 试试xtabs(~., df1)table(df1)
  • 这个问题与RStudio无关。请使用准确的主题。

标签: r dataframe matrix


【解决方案1】:

您可以使用 tidyr 中的 pivot_wider()

df%>%
        pivot_wider(names_from = id, values_from=id)%>%
        mutate(across(where(is.numeric), ~ifelse(is.na(.), 0, 1)))%>%
        select(where(is.numeric))%>%
        as.matrix

     111 222 444 555
[1,]   1   0   0   1
[2,]   0   1   0   0
[3,]   1   0   0   0
[4,]   0   0   1   0

如果你对数据框没问题,你可以省略最后两行代码:

df%>%
        pivot_wider(names_from = id, values_from=id)%>%
        mutate(across(where(is.numeric), ~ifelse(is.na(.), 0, 1)))

# A tibble: 4 x 5
  name  `111` `222` `444` `555`
  <fct> <dbl> <dbl> <dbl> <dbl>
1 A         1     0     0     1
2 B         0     1     0     0
3 C         1     0     0     0
4 D         0     0     1     0

【讨论】:

  • 感谢您的帮助。当我使用您的方法时,出现以下错误:视图中的错误:“名称”属性 [1] 必须与向量 [0] 的长度相同。你知道怎么改名字吗?
  • 我无法用您提供的数据重现此问题
  • 也许这会有所帮助:stackoverflow.com/questions/33152715/…
猜你喜欢
  • 1970-01-01
  • 2018-11-17
  • 2015-02-01
  • 2015-03-03
  • 2015-05-27
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多