【问题标题】:Creating counts in a table with time component variables在具有时间分量变量的表中创建计数
【发布时间】:2021-06-14 00:37:52
【问题描述】:

以下是我的数据子集:

structure(list(ver = c("T4", "T5", "T6", "T4", "T5", "T6"), base = c(1, 0, 0, 1, 0, 0), one = c(0, 1, 1, 0, 0, 0), two = c(0, 0, 0, 0, 1, 1), gradeT4base = c(2, 0, 0, 0, 0, 0), gradeT5base = c(0, 0, 0, 1, 0, 0), gradeT4one = c(3, 1, 0, 0, 0, 0), gradeT5one = c(0, 0, 1, 2, 0, 0), gradeT4two = c(2, 1, 0, 1, 0, 2), gradeT5two = c(0, 1, 0, 3, 2, 1)), class = "data.frame", row.names = c(NA, -6L))
  • base=虚拟变量,1=基线处第一次骨折,0=基线处没有首次骨折
  • one=虚拟变量,1=随访一年内首次骨折,0=未随访一年首次骨折 ...
  • gradeT4base= 显示 T4 椎骨骨折等级,0=无骨折,1=轻度骨折,2=重度骨折 ...
  • grade T5one= 1 年随访时 T5 椎骨骨折类型,0=无骨折,1=轻度骨折,2=严重骨折

我需要创建一个表格,仅在第一次椎体骨折发生时显示每个椎体的计数和骨折等级,

  • 第一次椎体骨折发生在第一个骨折迹象发生的地方。
  • 例如第二行,患者的第一个椎体骨折等级为 1,随访一年。
  • 因此,第一次 VF 发生在随访一年。

使用上述数据的示例表:

一些进一步的解释: 看受试者 6,第一次椎体骨折发生在 2 年,他们有 2 级的 T4 和 1 级的 T5。因此,第 2 级的 T4 行计数将增加 1,而 1 级的 T5 将增加 1。

  • 当第一次发生椎体骨折时,我想计算两个椎体中每个等级的骨折数。查看变量baseonetwo 告诉我们第一次椎体骨折发生的时间,

  • 我想按等级总结每个骨折的数量。

  • 查看第 1 行,第一个 VF 发生在基线。我们可以看到gradeT4base 和gradeT5base 用于他们在基线时的成绩评估,gradeT4base 的值为2。

  • 在我的计数表中,2 级的 T4 的第 2 行将增加 1 个计数。

  • 由于我们只查看第一个VF,因此不会计算该行的剩余值

【问题讨论】:

  • 请使用dput()而不是图片提供您的数据。
  • 您能详细说明一下吗?抱歉,这是我第一次使用 stackexchange。我运行以下命令并获得以下输出 > dput(dat) structure(list(ver = c("T4", "T5", "T6", "T4", "T5", "T6"), base = c (1, 0, 0, 1, 0, 0), 一 = c(0, 1, 1, 0, 0, 0), 二 = c(0, 0, 0, 0, 1, 1),gradeT4base = c(2, 0, 0, 0, 0, 0),等级T5base = c(0, 0, 0, 1, 0, 0),等级T4one = c(3, 1, 0, 0, 0, 0),等级T5one = c(0, 0, 1, 2, 0, 0),等级T4two = c(2, 1, 0, 1, 0, 2),等级T5two = c(0, 1, 0, 3, 2, 1)) , class= "data.frame", row.names = c(NA, -6L))
  • 我不清楚你是如何从输入计算输出的。
  • 第一次椎体骨折发生的时间是什么?
  • 第一次椎体骨折发生在第一个骨折迹象发生的地方。例如第二排,患者的第一个椎体骨折等级为 1,随访一年。因此,第一次 VF 发生在随访一年。

标签: r


【解决方案1】:

我想我终于明白了

  1. 方法 1
data %>%
  mutate(across(ends_with('base'), ~ na_if(. * base, 0)),
         across(ends_with('one'), ~na_if(. * one, 0)),
         across(ends_with('two'), ~na_if(. * two, 0))) %>%
  select(starts_with('grade')) %>%
  pivot_longer(everything(), names_pattern = 'grade(T\\d+).*', 
               names_to = 'vert', values_to = 'grade', values_drop_na = T) %>%
  count(vert, grade, name = 'count') %>%
  complete(nesting(vert), grade = 1:3, fill = list(count = 0))

# A tibble: 6 x 3
  vert  grade count
  <chr> <dbl> <dbl>
1 T4        1     1
2 T4        2     2
3 T4        3     0
4 T5        1     3
5 T5        2     1
6 T5        3     0

  1. 方法-2
data <- structure(list(ver = c("T4", "T5", "T6", "T4", "T5", "T6"), base = c(1, 0, 0, 1, 0, 0), one = c(0, 1, 1, 0, 0, 0), two = c(0, 0, 0, 0, 1, 1), gradeT4base = c(2, 0, 0, 0, 0, 0), gradeT5base = c(0, 0, 0, 1, 0, 0), gradeT4one = c(3, 1, 0, 0, 0, 0), gradeT5one = c(0, 0, 1, 2, 0, 0), gradeT4two = c(2, 1, 0, 1, 0, 2), gradeT5two = c(0, 1, 0, 3, 2, 1)), class = "data.frame", row.names = c(NA, -6L))

library(tidyverse)

data %>% mutate(rowid = row_number()) %>% select(-ver) %>%
  pivot_longer(!rowid, names_pattern = '(gradeT\\d)*(.*)', names_to = c('name', 'd')) %>%
  mutate(name = ifelse(name == '', 'dummy', name)) %>%
  pivot_wider(names_from = name, values_from = value) %>%
  group_by(rowid) %>%
  filter(dummy == 1) %>% select(-c(d, dummy)) %>%
  pivot_longer(-rowid, names_to = 'vert', values_to = 'grade') %>%
  filter(grade != 0) %>%
  ungroup() %>%
  count(vert, grade, name = 'count') %>%
  complete(nesting(vert), grade = 1:3, fill = list(count = 0))
#> # A tibble: 6 x 3
#>   vert    grade count
#>   <chr>   <dbl> <dbl>
#> 1 gradeT4     1     1
#> 2 gradeT4     2     2
#> 3 gradeT4     3     0
#> 4 gradeT5     1     3
#> 5 gradeT5     2     1
#> 6 gradeT5     3     0

reprex package (v2.0.0) 于 2021-06-14 创建

【讨论】:

  • 关于方法1的问题,你能解释一下运行pivot_longer的原因吗?
  • @Brenda,是的!输入中的成绩实际上是变量名称,但输出中的变量。这就是为什么要支点。
猜你喜欢
  • 2018-10-30
  • 2013-08-31
  • 2022-09-27
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多