在R中,当这些变量在同一列中时,如何计算为(variable1-variable2)/variable2?

问题描述 投票:0回答:1

我有一个如下所示的数据集。

dataA=structure(list(tissue = c("Head", "Head", "Head", "Stem", "Stem","Stem", "Head", "Head", "Head", "Stem", "Stem", "Stem", "Head","Head", "Head", "Stem", "Stem", "Stem", "Head", "Head", "Head","Stem", "Stem", "Stem", "Head", "Head", "Head", "Stem", "Stem","Stem", "Head", "Head", "Head", "Stem", "Stem", "Stem", "Head","Head", "Head", "Stem", "Stem", "Stem", "Head", "Head", "Head","Stem", "Stem", "Stem", "Head", "Head", "Head", "Stem", "Stem","Stem", "Head", "Head", "Head", "Stem", "Stem", "Stem", "Head","Head", "Head", "Stem", "Stem", "Stem", "Head", "Head", "Head","Stem", "Stem", "Stem", "Head", "Head", "Head", "Stem", "Stem","Stem", "Head", "Head", "Head", "Stem", "Stem", "Stem", "Head","Head", "Head", "Stem", "Stem", "Stem", "Head", "Head", "Head","Stem", "Stem", "Stem", "Head", "Head", "Head", "Stem", "Stem","Stem", "Head", "Head", "Head", "Stem", "Stem", "Stem", "Head","Head", "Head", "Stem", "Stem", "Stem", "Head", "Head", "Head","Stem", "Stem", "Stem", "Head", "Head", "Head", "Stem", "Stem","Stem", "Head", "Head", "Head", "Stem", "Stem", "Stem", "Head","Head", "Head", "Stem", "Stem", "Stem", "Head", "Head", "Head","Stem", "Stem", "Stem"), row = c("outside", "outside", "outside","outside", "outside", "outside", "outside", "outside", "outside","outside", "outside", "outside", "outside", "outside", "outside","outside", "outside", "outside", "outside", "outside", "outside","outside", "outside", "outside", "east", "east", "east", "east","east", "east", "east", "east", "east", "east", "east", "east","middle", "middle", "middle", "middle", "middle", "middle", "west","west", "west", "west", "west", "west", "west", "west", "west","west", "west", "west", "east", "east", "east", "east", "east","east", "east", "east", "east", "east", "east", "east", "middle","middle", "middle", "middle", "middle", "middle", "west", "west","west", "west", "west", "west", "west", "west", "west", "west","west", "west", "east", "east", "east", "east", "east", "east","east", "east", "east", "east", "east", "east", "middle", "middle","middle", "middle", "middle", "middle", "west", "west", "west","west", "west", "west", "west", "west", "west", "west", "west","west", "east", "east", "east", "east", "east", "east", "east","east", "east", "east", "east", "east", "middle", "middle", "middle","middle", "middle", "middle", "west", "west", "west", "west","west", "west", "west", "west", "west", "west", "west", "west"), plot = c(5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7,7, 8, 8, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,4), treatment = c("Control", "Tr1", "Tr2", "Control", "Tr1","Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control","Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2","Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control","Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2","Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control","Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2","Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control","Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2","Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control","Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2","Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control","Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2","Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control","Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2","Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control","Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2","Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control","Tr1", "Tr2", "Control", "Tr1", "Tr2", "Control", "Tr1", "Tr2","Control", "Tr1", "Tr2"), yield = c(159.3, 59.7, 97.5, 74.65,34.05, 76.65, 99.3, 109, 82.3, 53.95, 52.95, 65.45, 119.4, 90.3,95.6, 61.65, 48.65, 83.15, 94.2, 291.6, 111.9, 77.55, 151.45,91.15, 52.5, 36.8, 25.2, 35.25, 27.85, 35.75, 73.4, 42.5, 38.9,48.55, 30.45, 53.45, 71.8, 69.6, 48.1, 51.95, 44.45, 64.55, 98.1,90, 48, 65.75, 54.05, 68.05, 66.7, 54.2, 42.3, 46.55, 36.25,51.15, 87.4, 77, 48.6, 59.75, 44.95, 58.05, 51.4, 48.6, 37.4,42.25, 44.15, 40.15, 71.4, 50.8, 7.4, 49.05, 31.15, 86.65, 68.8,92, 53.7, 59.35, 54.55, 65.35, 63, 38.9, 37.5, 46.35, 31.75,50.15, 80, 58.6, 60, 50.65, 35.05, 70.95, 77.8, 50.4, 30.6, 51.55,28.25, 37.15, 53.2, 61.9, 45.1, 32.45, 34.75, 53.45, 69.3, 49.2,39.4, 50.15, 31.15, 50.75, 74.9, 46.3, 46.5, 44.95, 28.95, 49.65,70, 56.6, 56.5, 46.65, 36.45, 58.45, 81.9, 51.4, 64.2, 53.75,34.35, 77.55, 55.2, 49, 48.3, 32.05, 35.15, 49.85, 75.6, 66.7,73.2, 44.15, 36.85, 61.05, 74.6, 50, 40.2, 47.75, 31.65, 45.65), responsiveness = c(NA, "-62.5%", "-38.8%", NA, "-54.4%", "2.7%",NA, "9.8%", "-17.1%", NA, "-1.9%", "21.3%", NA, "-24.4%", "-19.9%",NA, "-21.1%", "34.9%", NA, "209.6%", "18.8%", NA, "95.3%", "17.5%",NA, "-29.9%", "-52.0%", NA, "-21.0%", "1.4%", NA, "-42.1%", "-47.0%",NA, "-37.3%", "10.1%", NA, "-3.1%", "-33.0%", NA, "-14.4%", "24.3%",NA, "-8.3%", "-51.1%", NA, "-17.8%", "3.5%", NA, "-18.7%", "-36.6%",NA, "-22.1%", "9.9%", NA, "-11.9%", "-44.4%", NA, "-24.8%", "-2.8%",NA, "-5.4%", "-27.2%", NA, "4.5%", "-5.0%", NA, "-28.9%", "-89.6%",NA, "-36.5%", "76.7%", NA, "33.7%", "-21.9%", NA, "-8.1%", "10.1%",NA, "-38.3%", "-40.5%", NA, "-31.5%", "8.2%", NA, "-26.8%", "-25.0%",NA, "-30.8%", "40.1%", NA, "-35.2%", "-60.7%", NA, "-45.2%","-27.9%", NA, "16.4%", "-15.2%", NA, "7.1%", "64.7%", NA, "-29.0%","-43.1%", NA, "-37.9%", "1.2%", NA, "-38.2%", "-37.9%", NA, "-35.6%","10.5%", NA, "-19.1%", "-19.3%", NA, "-21.9%", "25.3%", NA, "-37.2%","-21.6%", NA, "-36.1%", "44.3%", NA, "-11.2%", "-12.5%", NA,"9.7%", "55.5%", NA, "-11.8%", "-3.2%", NA, "-16.5%", "38.3%",NA, "-33.0%", "-46.1%", NA, "-33.7%", "-4.4%")), class = "data.frame", row.names = c(NA,-144L))

dataA

    tissue     row plot treatment  yield responsiveness
1     Head outside    5   Control 159.30           <NA>
2     Head outside    5       Tr1  59.70         -62.5%
3     Head outside    5       Tr2  97.50         -38.8%
4     Stem outside    5   Control  74.65           <NA>
5     Stem outside    5       Tr1  34.05         -54.4%
6     Stem outside    5       Tr2  76.65           2.7%
7     Head outside    6   Control  99.30           <NA>
8     Head outside    6       Tr1 109.00           9.8%
9     Head outside    6       Tr2  82.30         -17.1%
10    Stem outside    6   Control  53.95           <NA>
11    Stem outside    6       Tr1  52.95          -1.9%
12    Stem outside    6       Tr2  65.45          21.3%
13    Head outside    7   Control 119.40           <NA>
14    Head outside    7       Tr1  90.30         -24.4%
15    Head outside    7       Tr2  95.60         -19.9%
16    Stem outside    7   Control  61.65           <NA>
17    Stem outside    7       Tr1  48.65         -21.1%
18    Stem outside    7       Tr2  83.15          34.9%
19    Head outside    8   Control  94.20           <NA>
20    Head outside    8       Tr1 291.60         209.6%
21    Head outside    8       Tr2 111.90          18.8%
22    Stem outside    8   Control  77.55           <NA>
23    Stem outside    8       Tr1 151.45          95.3%
24    Stem outside    8       Tr2  91.15          17.5%
25    Head    east    1   Control  52.50           <NA>
26    Head    east    1       Tr1  36.80         -29.9%
27    Head    east    1       Tr2  25.20         -52.0%
28    Stem    east    1   Control  35.25           <NA>
29    Stem    east    1       Tr1  27.85         -21.0%
30    Stem    east    1       Tr2  35.75           1.4%

我想计算响应其他处理的产量百分比。例如,Tr1 中的%产量计算为(Tr1 - 对照)/每组组合(组织、行和图)的对照,我使用 Excel 进行计算。

我想使用 R 进行计算,我使用了下面的代码。

但是,和我计算的不一样。例如,(59.70 - 159.30)/159.30 为 -0.625,但计算出的 R 为 -0.200267917。

你能告诉我如何像我在Excel中计算一样计算吗?

谢谢,

dataB=data.frame(dataA %>%
      group_by(tissue, row, plot) %>%
      mutate(Calculation=ifelse(treatment!="Control", 
      (yield-yield[treatment=="Control"])/yield[treatment=="Control"], NA)))
dataB

    tissue     row plot treatment  yield responsiveness  Calculation
1     Head outside    5   Control 159.30           <NA>           NA
2     Head outside    5       Tr1  59.70         -62.5% -0.200267917
3     Head outside    5       Tr2  97.50         -38.8% -0.018126888
4     Stem outside    5   Control  74.65           <NA>           NA
5     Stem outside    5       Tr1  34.05         -54.4% -0.714824121
6     Stem outside    5       Tr2  76.65           2.7%  0.243309002
7     Head outside    6   Control  99.30           <NA>           NA
8     Head outside    6       Tr1 109.00           9.8%  0.405544810
9     Head outside    6       Tr2  82.30         -17.1%  0.567619048
10    Stem outside    6   Control  53.95           <NA>           NA
11    Stem outside    6       Tr1  52.95          -1.9% -0.278610354
12    Stem outside    6       Tr2  65.45          21.3%  0.348094748
13    Head outside    7   Control 119.40           <NA>           NA
14    Head outside    7       Tr1  90.30         -24.4%  0.738209817
15    Head outside    7       Tr2  95.60         -19.9% -0.025484200
16    Stem outside    7   Control  61.65           <NA>           NA
17    Stem outside    7       Tr1  48.65         -21.1% -0.270614693
18    Stem outside    7       Tr2  83.15          34.9%  0.786251343
19    Head outside    8   Control  94.20           <NA>           NA
20    Head outside    8       Tr1 291.60         209.6%  3.880334728
21    Head outside    8       Tr2 111.90          18.8%  1.177042802
22    Stem outside    8   Control  77.55           <NA>           NA
23    Stem outside    8       Tr1 151.45          95.3%  1.121148459
24    Stem outside    8       Tr2  91.15          17.5%  0.858307849
25    Head    east    1   Control  52.50           <NA>           NA
26    Head    east    1       Tr1  36.80         -29.9% -0.379949452
27    Head    east    1       Tr2  25.20         -52.0% -0.600000000
r variables dplyr mutate
1个回答
0
投票

请尝试以下代码

library(dplyr)

result <- dataA %>%
  group_by(tissue, row, plot) %>%
  mutate(PercentageChange = ifelse(treatment == "Control", NA, (yield - yield[treatment == "Control"]) / yield[treatment == "Control"] * 100))


# OUTPUT

# A tibble: 6 × 6
# Groups:   tissue, row, plot [2]
  tissue row      plot treatment yield PercentageChange
  <chr>  <chr>   <int> <chr>     <dbl>            <dbl>
1 Head   outside     5 Control   159.             NA   
2 Head   outside     5 Tr1        59.7           -62.5 
3 Head   outside     5 Tr2        97.5           -38.8 
4 Stem   outside     5 Control    74.6            NA   
5 Stem   outside     5 Tr1        34.0           -54.4 
6 Stem   outside     5 Tr2        76.6             2.68


© www.soinside.com 2019 - 2024. All rights reserved.