首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在分组数据中总结不同的字符串并用不完整的数据水平地展开它们?(R)

如何在分组数据中总结不同的字符串并用不完整的数据水平地展开它们?(R)
EN

Stack Overflow用户
提问于 2022-08-23 14:43:00
回答 2查看 38关注 0票数 1

这一问题涉及:

In R: How to extract a specific (e.g. last) value from a dataframe with multiple rows belonging to one person?

上下文

我有一个数据,其中包含了一组患者移植后随访访问的变量。

现在有三个相关的变量: 1)病人鉴定;2)独特的移植鉴定;3)移植与随访之间的天数。

每一行都是后续访问。数据帧中的每个病人都可以有多个随访。每个病人的随访量各不相同。

一些后续检查缺少移植鉴定。有时病人有两次移植,所以移植ID不同。目前还不清楚每个病人的不同移植ID的最大数量是多少。

问题:

首先我想知道哪些病人有0,1,2.等移植证。

在此之后,我想提取移植鉴定,并把它放在一个单独的专栏,为所有的后续行动的特定病人。

示例

代码语言:javascript
复制
patient_ID <- c("A", "A", "A", "A", "B", "B", "C", "C", "C")
tx_ID <- c("123", NA, NA, "123", NA, NA, "456", NA, "789")
days_from_tx <- c(0, 5, 10, 15, 2, 4, 1, 2, 3)
df <- data.frame(patient_ID, tx_ID, days_from_tx)

  patient_ID tx_ID days_from_tx
1          A   123            0
2          A  <NA>            5
3          A  <NA>           10
4          A   123           15
5          B  <NA>            2
6          B  <NA>            4
7          C   456            3
8          C  <NA>           10
9          C   789            2

我想要的是:

代码语言:javascript
复制
 patient_ID tx_ID days_from_tx nr_tx_ID  tx1  tx2
1          A   123            0        1  123 <NA>
2          A  <NA>            5        1  123 <NA>
3          A  <NA>           10        1  123 <NA>
4          A   123           15        1  123 <NA>
5          B  <NA>            2        0 <NA> <NA>
6          B  <NA>            4        0 <NA> <NA>
7          C   456            3        2  456  789
8          C  <NA>           10        2  456  789
9          C   789            2        2  456  789

我已经尝试过的

我试着把病人分组,然后找出唯一的移植ID,然后在一个新的专栏里写出来。我使用了我上一个问题的答案中的代码,并稍微修改了一下。

代码语言:javascript
复制
df %>%
  group_by(patient_ID) %>%
  mutate(
    last_followup = n_distinct(tx_ID, na.rm = TRUE)
  )

不幸的是,这是行不通的。R将所有患者独特的移植ID的数量打印到列中。

EN

回答 2

Stack Overflow用户

发布于 2022-08-23 14:59:25

您可以使用mutate()创建nr_tx_id列,并分别使用filter()distinct() with pivot_wider()‘获得宽格式的区分tx_IDs,然后加入这两个结果:

代码语言:javascript
复制
df %>% 
  group_by(patient_ID) %>% 
  mutate(nr_tx_ID = length(unique(tx_ID[!is.na(tx_ID)]))) %>% 
  ungroup()
  left_join(
    df %>% 
      filter(!is.na(tx_ID)) %>%
      distinct(patient_ID,tx_ID) %>% 
      group_by(patient_ID) %>% 
      mutate(id = row_number()) %>% 
      ungroup()
      pivot_wider(names_from = id, values_from = tx_ID,names_prefix = "tx")
  )

输出:

代码语言:javascript
复制
  patient_ID tx_ID days_from_tx nr_tx_ID tx1   tx2  
  <chr>      <chr>        <dbl>    <int> <chr> <chr>
1 A          123              0        1 123   NA   
2 A          NA               5        1 123   NA   
3 A          NA              10        1 123   NA   
4 A          123             15        1 123   NA   
5 B          NA               2        0 NA    NA   
6 B          NA               4        0 NA    NA   
7 C          456              1        2 456   789  
8 C          NA               2        2 456   789  
9 C          789              3        2 456   789  
票数 0
EN

Stack Overflow用户

发布于 2022-08-23 15:41:45

使用byunsplit

代码语言:javascript
复制
by(df, df$patient_ID, \(x) {
  tx <- sort(unique(x$tx_ID))
  cbind(x, nr_tx_ID=length(tx), tx1=tx[1], tx2=tx[2])
}) |> unsplit(df$patient_ID)
#   patient_ID tx_ID days_from_tx nr_tx_ID  tx1  tx2
# 1          A   123            0        1  123 <NA>
# 2          A  <NA>            5        1  123 <NA>
# 3          A  <NA>           10        1  123 <NA>
# 4          A   123           15        1  123 <NA>
# 5          B  <NA>            2        0 <NA> <NA>
# 6          B  <NA>            4        0 <NA> <NA>
# 7          C   456            1        2  456  789
# 8          C  <NA>            2        2  456  789
# 9          C   789            3        2  456  789

数据:

代码语言:javascript
复制
df <- structure(list(patient_ID = c("A", "A", "A", "A", "B", "B", "C", 
"C", "C"), tx_ID = c("123", NA, NA, "123", NA, NA, "456", NA, 
"789"), days_from_tx = c(0, 5, 10, 15, 2, 4, 1, 2, 3)), class = "data.frame", row.names = c(NA, 
-9L))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73460744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档