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

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

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

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

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

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

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

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

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

krcsximq

krcsximq1#

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

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

使用此示例数据:

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

相关问题