用R中的小滴值填充空矩阵

时间:2019-09-06 15:11:09

标签: r dataframe matrix

我生成了一个小节,其格式如下:

  V1 n
1 "Sam,Chris" 30
2 "Sam,Peter" 81
3 "Jeff,James" 5
4 "David,Jones" 6
5 "Harry,Otto" 8

我还有一个大矩阵,其中每一行和每一列都以一个名称命名,并且每个名称出现一次。所以我需要分割V1的每一行,以使矩阵的索引为:

   [Sam]
[Chris]30

例如,因此我需要以某种方式用逗号分开,然后填充矩阵,我将如何处理?

1 个答案:

答案 0 :(得分:1)

我们可能需要使用separate_rows

library(tidyverse)
df1 %>%      
  separate_rows(V1, sep=",") 

如果我们想将输出作为matrix

df1 %>%
   separate(V1, into = c("V1", "V2"), sep=",") %>%
   spread(V2, n, fill = 0) %>%
   column_to_rownames("V1")
#    Chris James Jones Otto Peter
#David    0    0    6   0    0
#Harry    0    0    0    8    0
#Jeff     0     5   0   0  0
#@Sam      30    0    0   0   81

可以通过在行名和列名中同时包含名字和姓氏来将其转换为方矩阵

tmp <- df1 %>%
       separate(V1, into = c("V1", "V2"), sep=",") 
lvls <- sort(unique(unlist(tmp[1:2])))
tmp %>% 
  mutate_at(vars(V1, V2), factor, levels = lvls) %>%
  spread(V2, n, fill = 0, drop = FALSE)

数据

df1 <- structure(list(V1 = c("Sam,Chris", "Sam,Peter", "Jeff,James", 
"David,Jones", "Harry,Otto"), n = c(30L, 81L, 5L, 6L, 8L)), 
 class = "data.frame", row.names = c("1", 
"2", "3", "4", "5"))