R从下一行中每隔一行减去
所以我搜索了一些其他的问题,但它们并不是我想要的 我有一个数据框,样本在列中,条件在行中。除约200行和约30000列外,数据排列如下:R从下一行中每隔一行减去,r,dataframe,R,Dataframe,所以我搜索了一些其他的问题,但它们并不是我想要的 我有一个数据框,样本在列中,条件在行中。除约200行和约30000列外,数据排列如下: donor_id time stimulation Gene_1 Gene_2 Gene_3 Gene_4 Gene_5 Gene_6 Gene_7 Gene_8 A 0.5h U 80
donor_id time stimulation Gene_1 Gene_2 Gene_3 Gene_4 Gene_5 Gene_6 Gene_7 Gene_8
A 0.5h U 80.56644 0 55.68308 3.567304 6.465864 1.095409 490.3318 2.322889
A 0.5h Stim 79.37402 0 55.88619 4.394622 6.503430 1.190555 453.7305 0.169858
A 1h U 62.73152 0 53.01435 3.596723 7.272073 0.736384 349.6818 1.307157
A 1h Stim 54.82245 0 53.17697 3.445614 5.385228 1.520416 332.2109 1.378058
B 0.5h U 69.89228 0 51.78394 2.410192 5.668343 1.482302 377.0095 0.589922
B 0.5h Stim 64.42587 0 52.67998 1.085260 8.958538 0.977994 382.8479 0.312372
B 1h U 56.47391 0.323123 52.93331 2.925232 5.650667 1.396532 356.9900 1.657515
B 1h Stim 0.25548 0.085027 49.85429 1.355360 5.030664 2.175491 218.5442 0.290898
我想从Stim行中减去所有的U行,留下我开始时的行数的一半。完整表中的每一行都有一个唯一的id和时间组合
我可以通过搜索找到的所有类似问题似乎都想从其他所有行中减去一行,或者想从上面的行中减去每一行,而不是每隔一行。我确信一定有某种方法可以使用FOR循环或lappy,但我不知道如何使它跨越所有行和列。这是一个基本的R选项:
aggregate(df[4:11], by = list("donor_id" = df$donor_id, "time" = df$time), diff)
donor_id time Gene_1 Gene_2 Gene_3 Gene_4 Gene_5 Gene_6 Gene_7
1 A 0.5h -1.19242 0.000000 0.20311 0.827318 0.037566 0.095146 -36.6013
2 B 0.5h -5.46641 0.000000 0.89604 -1.324932 3.290195 -0.504308 5.8384
3 A 1h -7.90907 0.000000 0.16262 -0.151109 -1.886845 0.784032 -17.4709
4 B 1h -56.21843 -0.238096 -3.07902 -1.569872 -0.620003 0.778959 -138.4458
Gene_8
1 -2.153031
2 -0.277550
3 0.070901
4 -1.366617
或dplyr解决方案:
df %>%
group_by(donor_id, time) %>%
summarise_at(vars(starts_with("Gene")), diff)
# Groups: donor_id [2]
donor_id time Gene_1 Gene_2 Gene_3 Gene_4 Gene_5 Gene_6 Gene_7 Gene_8
<fct> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 0.5h -1.19 0 0.203 0.827 0.0376 0.0951 -36.6 -2.15
2 A 1h -7.91 0 0.163 -0.151 -1.89 0.784 -17.5 0.0709
3 B 0.5h -5.47 0 0.896 -1.32 3.29 -0.504 5.84 -0.278
4 B 1h -56.2 -0.238 -3.08 -1.57 -0.620 0.779 -138. -1.37
@Phil_D生成两个数据帧,一个只有U,另一个只有Stim,然后以线性方式减去所需的值,怎么样?假设数据帧每次都有一个偶数啊,这似乎是一个简单的解决方案,我应该想到我自己。。。看来效果不错,谢谢!谢谢,第一个解决方案运行良好,但由于某种原因,它似乎弄乱了我的列名。第二个解决方案似乎出现了错误:``错误:列ENSG0000000003的长度必须为1 a摘要值,而不是0``我已通过命名我们分组所依据的列表元素更正了第一个解决方案。第二种解决方案中的错误源于这样一个事实,即您的数据集中很可能有一列您既没有分组也没有汇总。您必须将其排除在外,或将其包括在汇总的选择中。现在它只需要以基因开头的字段。