这一问题涉及:
上下文
我有一个数据,其中包含了一组患者移植后随访访问的变量。
现在有三个相关的变量: 1)病人鉴定;2)独特的移植鉴定;3)移植与随访之间的天数。
每一行都是后续访问。数据帧中的每个病人都可以有多个随访。每个病人的随访量各不相同。
一些后续检查缺少移植鉴定。有时病人有两次移植,所以移植ID不同。目前还不清楚每个病人的不同移植ID的最大数量是多少。
问题:
首先我想知道哪些病人有0,1,2.等移植证。
在此之后,我想提取移植鉴定,并把它放在一个单独的专栏,为所有的后续行动的特定病人。
示例
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我想要的是:
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,然后在一个新的专栏里写出来。我使用了我上一个问题的答案中的代码,并稍微修改了一下。
df %>%
group_by(patient_ID) %>%
mutate(
last_followup = n_distinct(tx_ID, na.rm = TRUE)
)不幸的是,这是行不通的。R将所有患者独特的移植ID的数量打印到列中。
发布于 2022-08-23 14:59:25
您可以使用mutate()创建nr_tx_id列,并分别使用filter()和distinct() with pivot_wider()‘获得宽格式的区分tx_IDs,然后加入这两个结果:
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")
)输出:
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 发布于 2022-08-23 15:41:45
使用by和unsplit。
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数据:
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))https://stackoverflow.com/questions/73460744
复制相似问题