使用R(dplyr)从同一子集(朱利安日期)内的所有其他数据中减去控制行
到目前为止,我还没有找到一个合适的解决方案来解决我的堆栈溢出问题 我想使用使用R(dplyr)从同一子集(朱利安日期)内的所有其他数据中减去控制行,r,dplyr,subset,subtraction,R,Dplyr,Subset,Subtraction,到目前为止,我还没有找到一个合适的解决方案来解决我的堆栈溢出问题 我想使用dplyr从数据中减去一个控制值。我只需要从同一日期测量的数据中减去控件。我的数据框中包含多个日期,每个日期包含不同数量的数据 我的数据如下所示;其中,“F”是需要修改的样本,“AC”是将被减去的对照 Sample Tissue Date Result1 Result2 1 F 10-Jul 210 56.0 2 F 1
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) %>%
但没有真正的成功。我想有一个简单的解决方案,对此我将非常感激
因此,我最终得到的数据如下所示:
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%
按(日期)分组%>%
在(变量(3:4)、funs(.-.[tissure==“AC”])发生突变。
我的逻辑在这里有效吗?另外,为什么我需要从我的列号中取1才能使用
vars()
函数?我似乎已经用以下代码解决了这个问题:
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
myData2 <- myData %>%
group_by(Date) %>%
mutate_at(vars(3:4),funs(.-.[Tissue=="AC"]))
myData2%
分组单位(日期)%>%
在(变量(3:4)、funs(.-[组织==“AC”])处突变
我喜欢这个解决方案的简单性,但非常感谢其他受访者花时间来帮助我。我似乎用以下代码解决了这个问题:
myData2 <- myData %>%
group_by(Date) %>%
mutate_at(vars(3:4),funs(.-.[Tissue=="AC"]))
myData2%
分组单位(日期)%>%
在(变量(3:4)、funs(.-[组织==“AC”])处突变
我喜欢这个解决方案的简单性,但非常感谢其他受访者花时间来帮助我。您的解决方案与您想要的输出不匹配,因为它通过产生零来更改
tissure=AC
的行。此外,您还可以在mutate_at
中指定列的位置,因此必须确保这些位置在将来不会改变。此外,最后您可能需要取消分组,以防影响未来的数据操作。我喜欢mutate_at
解决方案:-),但我建议:myData%>%group_by(Date)%%>%mutate_at(vars(matches(“Result”)、funs(ifelse(tissure==“F”、.-[tissure==“AC”],))%%>%ungroup()
至少对我的数据而言,在下一步从数据中过滤出来时,AC的最终读数为零是可以的。谢谢你的改进!您的解决方案与所需的输出不匹配,因为它通过生成零来更改tissure=AC
所在的行。此外,您还可以在mutate_at
中指定列的位置,因此必须确保这些位置在将来不会改变。此外,最后您可能需要取消分组,以防影响未来的数据操作。我喜欢mutate_at
解决方案:-),但我建议:myData%>%group_by(Date)%%>%mutate_at(vars(matches(“Result”)、funs(ifelse(tissure==“F”、.-[tissure==“AC”],))%%>%ungroup()
至少对我的数据而言,在下一步从数据中过滤出来时,AC的最终读数为零是可以的。谢谢你的改进!
myData2 <- myData %>%
group_by(Date) %>%
mutate_at(vars(3:4),funs(.-.[Tissue=="AC"]))