我有一个数据框,在x轴上有诊断(从诊断1到30),在y轴上有ID号。观察结果是患者对医生的不同诊断。
我有一个更大的数据框,我对其进行了Traminer序列分析,并获得了上述数据框。看起来像这样:
我下面所说的诊断只是一个例子
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
答案 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)
在某些情况下,考虑到重复相同的事情,您可能希望将其包装到一个函数中。