R语言 在计算后插入新行,并为多个主题循环

wfypjpf4  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(86)

这感觉像是一个基本的问题,因为我似乎不知道如何做到这一点。我想在执行计算后在数据框中插入一个新行,然后为每个参与者循环该过程(计算和插入输出行)。
我的数据框架看起来像这样(共有9名受试者),其中每个受试者有8个治疗前后结果:

| subID | treatment                    | outcome |
| ----- | ---------------------------- | ------- |
| 14325 | affected_pre_1               | 0.45    |
| 14325 | affected_pre_2               | 0.25    |
| 14325 | unaffected_pre_1             | 1.05    |
| 14325 | unaffected_pre_2             | 1.23    |
| 14325 | affected_post_1              | 0.22    |
| 14325 | affected_post_2              | 0.45    |
| 14325 | unaffected_post_1            | 0.87    |
| 14325 | unaffected_post_2            | 0.34    |
| 18964 | affected_pre_1               | 0.90    |
| 18964 | affected_pre_2               | 1.13    |
| 18964 | unaffected_pre_1             | 0.55    |
| 18964 | unaffected_pre_2             | 0.23    |
| 18964 | affected_post_1              | 0.17    |
| 18964 | affected_post_2              | 1.22    |
| 18964 | unaffected_post_1            | 1.89    |
| 18964 | unaffected_post_2            | 0.76    |
| 39274 | affected_pre_1               | 0.88    |
| 39274 | affected_pre_2               | 0.12    |
| 39274 | unaffected_pre_1             | 0.05    |
| 39274 | unaffected_pre_2             | 0.34    |
| 39274 | affected_post_1              | 0.99    |
| 39274 | affected_post_2              | 0.32    |
| 39274 | unaffected_post_1            | 1.81    |
| 39274 | unaffected_post_2            | 1.34    |
|  ...  | ...                          | ...     |

我想用以下计算为每个主题创建4个新行(基本上规范化了一些度量):

row 1 = affected_pre_2 / affected_pre_1
row 2 = unaffected_pre_2 / unaffected_pre_1
row 3 = affected_post_2 / affected_post_1
row 4 = unaffected_post_2 / unaffected_post_1

根据之前的答案,我尝试了以下方法:

data %>%
bind_rows(data %>% summarise(subID = str_c(subID, lead(subID), sep = '_')) %>% na.omit() %>%
bind_cols(data %>% summarise(across(5:11, ~ . - lead(.))) %>% na.omit()))

交叉(5:11...)指的是我拥有的多个结果变量(在我的示例数据集中,为了简单起见,我只包含了一个结果变量)。
然而,我得到了一个警告,summarise()被弃用了--有没有更好的方法来做到这一点?
我 * 认为 * 我可能还需要在其中的某个地方使用apply函数,但我不确定如何在每个主题中循环所有内容。任何帮助都将非常感谢!

8mmmxcuj

8mmmxcuj1#

我认为pivot/mutate/pivot在这里应该可以很好地工作:

library(tidyr) # pivot_*
pivot_wider(quux, subID, names_from = treatment, values_from = outcome) %>%
  transmute(
    subID, 
    row1 = affected_pre_2 / affected_pre_1, 
    row2 = unaffected_pre_2 / unaffected_pre_1, 
    row3 = affected_post_2 / affected_post_1, 
    row4 = unaffected_post_2 / unaffected_post_1
  ) %>%
  pivot_longer(-subID, names_to = "treatment", values_to = "outcome")
# # A tibble: 12 × 3
#    subID treatment outcome
#    <int> <chr>       <dbl>
#  1 14325 row1        0.556
#  2 14325 row2        1.17 
#  3 14325 row3        2.05 
#  4 14325 row4        0.391
#  5 18964 row1        1.26 
#  6 18964 row2        0.418
#  7 18964 row3        7.18 
#  8 18964 row4        0.402
#  9 39274 row1        0.136
# 10 39274 row2        6.8  
# 11 39274 row3        0.323
# 12 39274 row4        0.740
qfe3c7zg

qfe3c7zg2#

就像这样:

df %>% 
  group_by(subID, row =as.integer(gl(n(),2,n()))) %>% 
  transmute(x = last(outcome)/first(outcome)) %>% 
  slice(1) %>% 
  group_by(subID) %>% 
  mutate(row = paste0("row", row_number()))
subID row       x
   <int> <chr> <dbl>
 1 14325 row1  0.556
 2 14325 row2  1.17 
 3 14325 row3  2.05 
 4 14325 row4  0.391
 5 18964 row1  1.26 
 6 18964 row2  0.418
 7 18964 row3  7.18 
 8 18964 row4  0.402
 9 39274 row1  0.136
10 39274 row2  6.8  
11 39274 row3  0.323
12 39274 row4  0.740

相关问题