计算行中的当前值与R中每列的空白值之差

o2rvlv0m  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(113)

我有一个这样的 Dataframe (这是一个示例 Dataframe ):

id_row  Sample  wsts (xc)   wstm (xc)   wst1 (xc)
1   Na  2427.5  4542.5  2930
2   Na  1294.5  3642.5  1297
3   Ca  3048    5127.5  3456
4   Ca  2340    1729.5  2437
5   blank   2568.5  2529.5  2540
6   blank   2345    2001    2521
7   blank   2323    2121    2590
8   blank   2112.5  2129    2561

我正在尝试对我的数据应用特定的标准化方法。这是主要的想法。
第一:计算同一列中所有空格的平均值,例如第5行到第8行为空格。所以对于列wsts (xc),我需要计算该列上这些空白值的平均值。然后对列wstm (xc)wst1 xc执行相同的操作。(在本例中,我更喜欢不指定所有列名,因为我的真实的数据框中有100个)。
其次,在计算每列的空白平均值之后,我需要从不同于空白的值中减去该列的空白平均值,如NaCa。举例来说:

id_row | Sample | wsts (xc) |  wstm (xc) | wst1 (xc) |
1 |  Na | 2427.5-(average of blank in that column) | 4542.5-(...) | 2930-(...) |
2 |  Na | 1294.5-(average...) | ...

第三,当计算新值时,我想用结果创建一个新列,并将旧列(理想情况下)保留在旧列旁边。下面是一个例子(其中:old name (xc)_norm是规范化新列的名称),

id_row | Sample | wsts (xc) | wsts (xc)_norm | wstm (xc) | wstm (xc)_norm | wst1 (xc) | wst1 (xc)_norm |
1 | Na | 2427.5 | new_value | 4542.5 | new_value | 2930 | new_value | ...

我认为要实现这个目标,我需要在R中创建一个函数,到目前为止,我还不知道如何做到这一点而不会卡住。
另一种选择是使用Excel,这更简单,因为我可以在一个单元格中设置一个函数并将其应用于其他行,但是,我不想这样做。
有什么想法可以实现我的目标吗?
R中有没有什么函数可以让我实现我的目标?
我需要创建一个函数吗?

krcsximq

krcsximq1#

下面是一种使用dplyracross()来指定列的方法。它在选择需要转换的列方面非常灵活--这里我已经将该函数应用于所有名称中包含“xc”的列,但您可以列出它们,使用其他模式等。

library(dplyr)
df |>
  mutate(across(
    contains("xc"),
    \(x) ifelse(
      Sample == "blank", 
      mean(x[Sample == "blank"]),
      x - mean(x[Sample == "blank"])
    ), 
    .names = "{.col}_norm"  
  ))
#   id_row Sample wsts (xc) wstm (xc) wst1 (xc) wsts (xc)_norm wstm (xc)_norm wst1 (xc)_norm
# 1      1     Na    2427.5    4542.5      2930          90.25       2347.375            377
# 2      2     Na    1294.5    3642.5      1297       -1042.75       1447.375          -1256
# 3      3     Ca    3048.0    5127.5      3456         710.75       2932.375            903
# 4      4     Ca    2340.0    1729.5      2437           2.75       -465.625           -116
# 5      5  blank    2568.5    2529.5      2540        2337.25       2195.125           2553
# 6      6  blank    2345.0    2001.0      2521        2337.25       2195.125           2553
# 7      7  blank    2323.0    2121.0      2590        2337.25       2195.125           2553
# 8      8  blank    2112.5    2129.0      2561        2337.25       2195.125           2553

使用此示例数据:

df = read.table(text = 'id_row  Sample  "wsts (xc)"   "wstm (xc)"   "wst1 (xc)"
1   Na  2427.5  4542.5  2930
2   Na  1294.5  3642.5  1297
3   Ca  3048    5127.5  3456
4   Ca  2340    1729.5  2437
5   blank   2568.5  2529.5  2540
6   blank   2345    2001    2521
7   blank   2323    2121    2590
8   blank   2112.5  2129    2561', header = TRUE, check.names = FALSE)

相关问题