gpt4 book ai didi

r - 如何根据单元格值创建新行?

转载 作者:行者123 更新时间:2023-12-04 22:19:31 25 4
gpt4 key购买 nike

我有一个数据框 df在哪里:

 Days    Treatment A   Treatment B   Treatment C 
0 5 1 1
1 0 2 3
2 1 1 0
例如,接受治疗 A 的 5 人存活了 0 天,1 人存活了 2 天,依此类推。但是,我希望这 5 个人现在成为唯一的行,该单元格代表他们存活的天数:
 Patient #   A   B   C       
1 0
2 0
3 0
4 0
5 0
6 2
7 0
8 1
9 1
10 2
11 0
12 1
13 1
14 1
让 Patient # = 任意值。
如果这描述性不够,我很抱歉,但我感谢您提供的任何和所有帮助!我目前在 Excel 中有数据集,但如果这样更容易,我可以将其放入 R 中。

最佳答案

我们可以replist 中的每个 'Patient' 列值找出 'Days' 值,然后创建一个 list序列,使用 Map构建 data.frame最后使用 bind_rows

library(dplyr)
lst1 <- lapply(df[-1], function(x) rep(df$Days, x))
bind_rows(Map(function(x, y, z) setNames(data.frame(x, y),
c("Patient", z)), relist(seq_along(unlist(lst1)),
skeleton = lst1), lst1, sub("Treatment\\s+", "", names(lst1))))
-输出
#    Patient  A  B  C
#1 1 0 NA NA
#2 2 0 NA NA
#3 3 0 NA NA
#4 4 0 NA NA
#5 5 0 NA NA
#6 6 2 NA NA
#7 7 NA 0 NA
#8 8 NA 1 NA
#9 9 NA 1 NA
#10 10 NA 2 NA
#11 11 NA NA 0
#12 12 NA NA 1
#13 13 NA NA 1
#14 14 NA NA 1

或另一种选择,将形状改造成“长”,然后改成“宽”
library(tidyr)
df %>%
pivot_longer(cols = -Days) %>%
separate(name, into = c('name1', 'name2')) %>%
group_by(name2) %>%
summarise(value = rep(Days, value), .groups = 'drop') %>%
mutate(Patient = row_number()) %>%
pivot_wider(names_from = name2, values_from = value)
-输出
# A tibble: 14 x 4
# Patient A B C
# <int> <int> <int> <int>
# 1 1 0 NA NA
# 2 2 0 NA NA
# 3 3 0 NA NA
# 4 4 0 NA NA
# 5 5 0 NA NA
# 6 6 2 NA NA
# 7 7 NA 0 NA
# 8 8 NA 1 NA
# 9 9 NA 1 NA
#10 10 NA 2 NA
#11 11 NA NA 0
#12 12 NA NA 1
#13 13 NA NA 1
#14 14 NA NA 1
数据
df <- structure(list(Days = 0:2, `Treatment A` = c(5L, 0L, 1L), 
`Treatment B` = c(1L,
2L, 1L), `Treatment C` = c(1L, 3L, 0L)), class = "data.frame", row.names = c(NA,
-3L))

关于r - 如何根据单元格值创建新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65526301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com