【问题标题】:Spread to wide format based on conditions根据条件扩展为宽格式
【发布时间】:2019-11-28 15:03:39
【问题描述】:

我有一个长数据集,看起来像这样

ID <- c("A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B")
Year <- c(1,2,3,4,5,6,7,8,9,
          1,2,3,4,4,5,6,7,8,9)
treatID <- c(NA,NA,NA,"CCQ_A",NA,NA,"CCQ_C",NA,NA,
             NA,"CCQ+A",NA,"IOT+B","CCQ_K",NA,NA,"IOT_B",NA,NA)
SecondID <- c(NA,NA,NA,"CCQ",NA,NA,"CCQ",NA,NA,
              NA,"CCQ",NA,"IOT","CCQ",NA,NA,"IOT",NA,NA)
cond <- c(NA,NA,NA,0,NA,NA,0,NA,NA,
          NA,1,NA,1,1,NA,NA,1,NA,NA)
val <- c(NA,NA,NA,3,NA,NA,2,NA,NA,
         NA,3,NA,4,5,NA,NA,1,NA,NA)
df <- data.frame(ID,Year,treatID,SecondID,cond, val)

按ID分组,我想根据以下条件创建一个宽数据集:

1) 如果cond!=1 数据应该基于变量treatID 进行传播,(并包括val 分数)

2) 如果cond==1 数据应该基于变量SecondID 进行传播(并包括val 分数)

最终的数据集应该是这样的

ID <- c("A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B")
Year <- c(1,2,3,4,5,6,7,8,9,
          1,2,3,4,5,6,7,8,9)
CCQ_A <- c(NA,NA,NA,3,NA,NA,NA,NA,NA,
           NA,NA,NA,NA,NA,NA,NA,NA,NA)
CCQ_C <- c(NA,NA,NA,NA,NA,NA,2,NA,NA,
            NA,NA,NA,NA,NA,NA,NA,NA,NA)
S_ID_CCQ <-c(NA,NA,NA,NA,NA,NA,NA,NA,NA,
           NA,3,NA,NA,5,NA,NA,NA,NA)
S_ID_IOT <-c(NA,NA,NA,NA,NA,NA,NA,NA,NA,
             NA,NA,NA,4,NA,NA,NA,1,NA)
final <- data.frame(ID,Year,CCQ_A,CCQ_C,S_ID_CCQ, S_ID_IOT)

请不要添加S_ID 来识别哪些列一直在使用SecondID 变量进行分类

我可以在一个条件wide&lt;- df %&gt;% group_by(ID) %&gt;% spread (treatID, val) 下进行传播,但我不确定如何处理多个条件。

另外,请注意,当涉及到 YearID 标识符时,df 包含一些重复的观察结果(即 ID=BYear=4 有两行),而最终数据集只有一个观察结果ID=BYear=4。这不是这个问题的基本要素,但如果你也能帮助我,那就太好了

我希望这很清楚

非常感谢您的帮助

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    @Alex,希望这可能会有所帮助。对此可能有多种策略。一种方法是使用两个 pivot_longer 语句并连接生成的数据帧。

    下面是另一种方式,您首先使用pivot_longer,这样您就可以将所有ID 放在一个列中。然后,您可以根据条件筛选以选择具有treatIDSecondID 的行。

    最后,您可以使用pivot_wider 来获取您需要的列。

    library(tidyverse)
    
    df %>%
      pivot_longer(cols = c(treatID, SecondID), names_to = "ID_Type", values_to = "ID_Value", names_repair = "minimal") %>%
      filter(if_else(cond != 1 | is.na(cond), ID_Type == "treatID", ID_Type == "SecondID")) %>%
      pivot_wider(id_cols = c("ID", "Year", "cond"), names_from = c("ID_Type", "ID_Value"), values_from = "val") %>%
      select(-c(cond, treatID_NA))
    

    这与您的示例数据一起给出了这些结果:

    # A tibble: 18 x 6
       ID     Year treatID_CCQ_A treatID_CCQ_C SecondID_CCQ SecondID_IOT
       <fct> <dbl>         <dbl>         <dbl>        <dbl>        <dbl>
     1 A         1            NA            NA           NA           NA
     2 A         2            NA            NA           NA           NA
     3 A         3            NA            NA           NA           NA
     4 A         4             3            NA           NA           NA
     5 A         5            NA            NA           NA           NA
     6 A         6            NA            NA           NA           NA
     7 A         7            NA             2           NA           NA
     8 A         8            NA            NA           NA           NA
     9 A         9            NA            NA           NA           NA
    10 B         1            NA            NA           NA           NA
    11 B         2            NA            NA            3           NA
    12 B         3            NA            NA           NA           NA
    13 B         4            NA            NA            5            4
    14 B         5            NA            NA           NA           NA
    15 B         6            NA            NA           NA           NA
    16 B         7            NA            NA           NA            1
    17 B         8            NA            NA           NA           NA
    18 B         9            NA            NA           NA           NA
    

    我注意到的几件事:

    第一,根据数据,ID == BYear == 4 and Year == 7 有几个值,看起来与您的结果不同。

    其次,您可以用不同的方式处理重复的观察结果。你想怎么对付他们?你想要的结果是什么?

    【讨论】:

    • 亲爱的 Ben 非常感谢,这太棒了!我能够找到一种方法来处理重复的观察:)
    猜你喜欢
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    相关资源
    最近更新 更多