R从下一行中每隔一行减去

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

所以我搜索了一些其他的问题,但它们并不是我想要的

我有一个数据框,样本在列中,条件在行中。除约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.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``我已通过命名我们分组所依据的列表元素更正了第一个解决方案。第二种解决方案中的错误源于这样一个事实,即您的数据集中很可能有一列您既没有分组也没有汇总。您必须将其排除在外,或将其包括在汇总的选择中。现在它只需要以基因开头的字段。