如何将数据框中的相同观察结果分组为一组

时间:2019-01-03 08:46:46

标签: r dplyr sequence sankey-diagram traminer

我有一个数据框,在x轴上有诊断(从诊断1到30),在y轴上有ID号。观察结果是患者对医生的不同诊断。

我有一个更大的数据框,我对其进行了Traminer序列分析,并获得了上述数据框。看起来像这样:

  • d1(诊断1)等
  • 我下面所说的诊断只是一个例子

             d1         d2      d3        d4     d5    d6   d7 etc.
          1 cancer
          2 cancer
          3 nothing
          4 nothing
          5 cancer 
          6 headache
    

因此,我想建立一个新的数据框,在其中将所有在初次诊断中患有“癌症”的患者归为一组,并在分组中将所有初诊为“无”的患者归为一类。 这是因为数据框很大,我想尽量减少这种方式。

数据示例:

set.seed(1) 
Data <- data.frame( d1 = sample(c("cancer", "cancer", "cancer",
 "cancer","nothing", "cancer","cancer", "cancer" )), d2 = sample(c("cancer",
 "headache", "cancer", "cancer", "nothing", "nothing", "nothing", "nothing")),
 d3 = sample(c("cancer", "headache", "cancer", "cancer", "headache", "nothing",
 "nothing", "headache")) )

有可能吗?

预期结果:

我期望得到这样的结果:我可以将患有癌症的人数作为第一诊断,而将“无”作为第一诊断,依此类推。 所以也许是这样的:

        D1   D2    D3 D4 D5 ECT.
 CANCER   5    4
 HEADACHE 4    3
 NOTHING  1    3

2 个答案:

答案 0 :(得分:2)

一种方法是使用转换为长格式,先计数然后再传播到宽格式。使用tidyverse来完成

library(tidyverse)

Data %>% 
 gather(var, val) %>% 
 group_by_all() %>% 
 count() %>% 
 spread(var, n)

给出,

# A tibble: 3 x 4
  val         d1    d2    d3
  <chr>    <int> <int> <int>
1 cancer       7     3     3
2 headache    NA     1     3
3 nothing      1     4     2

答案 1 :(得分:0)

这可以做得更优雅,但可以处理reprex数据以及其他内容:

before:

/var/www/html/sggit/deb.php:15:
array (size=2)
  'position' => string '1' (length=1)
  'count' => int 4


/var/www/html/sggit/deb.php:15:
array (size=2)
  'position' => string '2' (length=1)
  'count' => int 3


modifying items...
after:

/var/www/html/sggit/deb.php:26:
array (size=2)
  'position' => string '1' (length=1)
  'count' => int 8


/var/www/html/sggit/deb.php:26:
array (size=2)
  'position' => string '2' (length=1)
  'count' => int 6

来自reprex数据的结果:

library(tidyverse)
df <- as.tibble(table(Data$d1)) %>% 
  rename(D1 = n) %>%
  merge(as.tibble(table(Data$d2)), by = "Var1", all = TRUE) %>%
  rename(D2 = n) %>%
  merge(as.tibble(table(Data$d3)), by = "Var1", all = TRUE) %>%
  rename(D3 = n)

在某些情况下,考虑到重复相同的事情,您可能希望将其包装到一个函数中。