我有一个long df,看起来像这样:

df <- data.frame(id=as.integer(c(123,123,123,124,124,124,125,125,126,126,126)),
                 date=as.Date(c("2014-03-12", "2015-05-02", "2015-09-16", "2015-10-24", "2016-12-11", "2017-10-17", "2017-08-06", "2018-01-29", "2015-09-16", "2015-11-12", "2015-12-03")),
                 event=as.character(c("A", "C", "E", "A", "B", "D", "A", "E", "A", "B", "E")),
                 order=as.integer(c(1,2,3,1,2,3,1,2,1,2,3)),
                 diff=as.integer(c(0,416,553,0,414,724,0,176,0,57,78)))

df
    id       date event order diff
1  123 2014-03-12     A     1    0
2  123 2015-05-02     C     2  416
3  123 2015-09-16     E     3  553
4  124 2015-10-24     A     1    0
5  124 2016-12-11     B     2  414
6  124 2017-10-17     D     3  724
7  125 2017-08-06     A     1    0
8  125 2018-01-29     E     2  176
9  126 2015-09-16     A     1    0
10 126 2015-11-12     B     2   57
11 126 2015-12-03     E     3   78

每个id将始终具有初始事件A和最终事件DE(相互排斥).事件BC可能发生,也可能不发生.diff是每个事件的date与初始事件Aiddate之间的days的差值.

我想要得到wide df,其中每个事件将是column(例如A_status),其中0= absent1= present.类似地,每个通信者diff将是column(例如A_time).但是当事件BC不存在时(例如B= 0C= 0),我希望它们的time填充D_timeE_time,无论存在哪一个.

我需要基于DEvalues创建两个columns:

  1. A column D.E_status,其中0=D1=E;及
  2. 将接收(DE的)记录的任何timecolumn D.E_time.

这是所需的输出:

id  A_status A_time B_status B_time C_status C_time D.E_status  D.E_time
123 1        0      0        553    1        416    1           553
124 1        0      1        414    0        724    0           724
125 1        0      0        176    0        176    1           176
126 1        0      1        57     0        78     1           78

考虑到我非常基本的R技能,我真的很感谢你在这方面的帮助.

推荐答案

我将演示一个dplyr/tidyr的解决方案.首先,我认为B_time的最后一个值应该是57,而不是78.

library(dplyr)
library(tidyr) # pivot_wider
df %>%
  mutate(
    status = if_else(event == "D", 0, 1),
    event = if_else(event %in% c("D", "E"), "D.E", event)
  ) %>%
  pivot_wider(
    id_cols = "id",
    names_from = "event", values_from = c("diff", "status")
  ) %>%
  rename_with(.fn = ~ sub("diff", "time", sub("(.*)_(.*)", "\\2_\\1", .))) %>%
  mutate(
    across(c(C_time, B_time), ~ coalesce(., D.E_time)),
    across(c(C_status, B_status), ~ +(!is.na(.)))
  ) %>%
  select(order(colnames(.))) %>%
  relocate(id)
# # A tibble: 4 × 9
#      id A_status A_time B_status B_time C_status C_time D.E_status D.E_time
#   <int>    <dbl>  <int>    <int>  <int>    <int>  <int>      <dbl>    <int>
# 1   123        1      0        0    553        1    416          1      553
# 2   124        1      0        1    414        0    724          0      724
# 3   125        1      0        0    176        0    176          1      176
# 4   126        1      0        1     57        0     78          1       78

R相关问答推荐

是否有任何解决方案可以优化VSCode中RScript的图形绘制?

导入到固定列宽的R中时出现问题

从R中的另一个包扩展S3类的正确方法是什么

在通过最大似然估计将ODE模型与数据匹配时,为什么要匹配实际参数的转换值?

R形式的一维数字线/箱形图样式图表

为什么当我try 在收件箱中使用合并功能时会出现回收错误?

二维样条,严格以一个参数递增

如何使用ggplot对堆叠条形图进行嵌套排序?

用约翰逊分布进行均值比较

按多列统计频次

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

将全局环境变量的名称分配给列表中的所有元素

正则表达式在第二个管道和第二个T之后拆分R中的列

如何将一些单元格的内容随机 Select 到一个数据框中?

在散点图中使用geom_point放置线图例

有没有办法将不等长的列表转换为R中的数据帧

如何预测原始数据集并将值添加到原始数据集中

数据集上的R循环和存储模型系数

R中的Desolve:返回的导数数错误

从单个html段落中提取键-值对