【问题标题】:Subtract control row from all other data within the same subset (Julian date) using R (dplyr)使用 R (dplyr) 从同一子集(儒略日期)中的所有其他数据中减去控制行
【发布时间】:2017-11-28 14:34:28
【问题描述】:

到目前为止,我无法在 Stack Overflow 上找到适合我的问题的解决方案。

我想使用dplyr 从我的数据中减去一个控制值。我只需要从同一日期测量的数据中减去对照。我的数据框中包含多个日期,每个日期包含不同数量的数据。

我的数据如下所示;其中“F”是需要修改的样本,“AC”是要减去的对照。

Sample  Tissue   Date       Result1     Result2
1       F      10-Jul          210         56.0
2       F      10-Jul          527        427.0
3       F      10-Jul          557         69.0
4       F      10-Jul          684        344.0
5       F      10-Jul          650         10.0
6       AC     10-Jul          200         10.0
7       F      12-Jul          676         65.0
8       F      12-Jul          520         70.0
9       F      12-Jul          595        730.0
10      AC     12-Jul          100          5.0

我想我需要使用:

myData <- myData2 %>%
group_by(Date) %>%

从那里我有点困惑,我试过了:

mutate(Result1 = Result1 - subset(myData$Result1, myData$Tissue=="AC"))

但没有真正的成功。我想那里有一个简单的解决方案,对此我将不胜感激!

因此我最终会得到如下所示的数据:

Sample  Tissue   Date       Result1     Result2
1       F      10-Jul           10         46.0
2       F      10-Jul          327        417.0
3       F      10-Jul          357         59.0
4       F      10-Jul          484        334.0
5       F      10-Jul          450          0.0
6       AC     10-Jul          200         10.0
7       F      12-Jul          576         60.0
8       F      12-Jul          420         65.0
9       F      12-Jul          495        725.0
10      AC     12-Jul          100          5.0

如果该函数可用于同时计算两个或多个结果的差异,那将很有用。提前致谢!

编辑:

我认为我已经找到了使用此代码的解决方案

myData2 <- myData %>% group_by(Date) %>%
mutate_at(vars(3:4),funs(.-.[Tissue=="AC"]))

我的逻辑在这里有效吗?另外,为什么我需要从列号中取 1 才能使用 vars() 函数?

【问题讨论】:

    标签: r dplyr subset subtraction


    【解决方案1】:

    我似乎已经用这个代码解决了它:

    myData2 <- myData %>% 
      group_by(Date) %>%
      mutate_at(vars(3:4),funs(.-.[Tissue=="AC"]))
    

    我喜欢这个解决方案的简单性,但非常感谢其他受访者花时间帮助我。

    【讨论】:

    • 您的解决方案与您想要的输出不匹配,因为它通过生成零来更改 Tissue = AC 所在的行。此外,您在 mutate_at 中指定列的位置,因此您必须确保这些位置将来不会改变。此外,最后您可能需要取消分组,以防这会影响未来的数据操作。
    • 我喜欢 mutate_at 解决方案 :-) 但我建议:myData %&gt;% group_by(Date) %&gt;% mutate_at(vars(matches("Result")), funs(ifelse(Tissue=="F", .-.[Tissue=="AC"], .))) %&gt;% ungroup()
    • 至少对于我的数据,AC 的读数为零是可以的,因为它们在下一步中被过滤掉了。不过感谢您的改进!
    【解决方案2】:
    df = read.table(text = "
    Sample  Tissue   Date       Result1     Result2
    1       F      10-Jul          210         56.0
    2       F      10-Jul          527        427.0
    3       F      10-Jul          557         69.0
    4       F      10-Jul          684        344.0
    5       F      10-Jul          650         10.0
    6       AC     10-Jul          200         10.0
    7       F      12-Jul          676         65.0
    8       F      12-Jul          520         70.0
    9       F      12-Jul          595        730.0
    10      AC     12-Jul          100          5.0
    ", stringsAsFactors=F, header=T)
    
    library(dplyr)
    
    df %>%
      group_by(Date) %>%                                                         # for each date
      mutate(control1 = Result1[Tissue == "AC"],                                 # calculate control values
             control2 = Result2[Tissue == "AC"]) %>%
      ungroup() %>%                                                              # forget about the grouping
      mutate(Result1 = ifelse(Tissue == "F", Result1 - control1, Result1),       # update result values only for rows with tissue = F
             Result2 = ifelse(Tissue == "F", Result2 - control2, Result2)) %>%
      select(Sample:Result2)                                                     # select columns of interest
    
    # # A tibble: 10 x 5
    #   Sample Tissue   Date Result1 Result2
    #    <int>  <chr>  <chr>   <int>   <dbl>
    # 1      1      F 10-Jul      10      46
    # 2      2      F 10-Jul     327     417
    # 3      3      F 10-Jul     357      59
    # 4      4      F 10-Jul     484     334
    # 5      5      F 10-Jul     450       0
    # 6      6     AC 10-Jul     200      10
    # 7      7      F 12-Jul     576      60
    # 8      8      F 12-Jul     420      65
    # 9      9      F 12-Jul     495     725
    # 10     10    AC 12-Jul     100       5
    

    control 列仅用于帮助您了解该过程。您可以使用:

    df %>%
      group_by(Date) %>%
      mutate(Result1 = ifelse(Tissue == "F", Result1 - Result1[Tissue == "AC"], Result1),
             Result2 = ifelse(Tissue == "F", Result2 - Result2[Tissue == "AC"], Result2)) %>%
      ungroup()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2020-12-21
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多