Subtracting after and before values of each sample for each numeric column in R

huangapple go评论92阅读模式
英文:

Subtracting after and before values of each sample for each numeric column in R

问题

以下是翻译好的部分:

  1. 我有一个类似下面示例结构的数据框
  2. ```R
  3. df <- data.frame(rbind(c("Sample1_x2", 10, 23, 6, 5, "Sample1", "after"),
  4. c("Sample2_x2", 8, 53, 22, 52, "Sample2", "after"),
  5. c("Sample1_x1", 12, 2, 44, 15, "Sample1", "before"),
  6. c("Sample3_x1", 27, 46, 16, 65, "Sample3", "before"),
  7. c("Sample2_x1", 41, 44, 27, 25, "Sample2", "before"),
  8. c("Sample3_x2", 5, 38, 9, 29, "Sample3", "after")))
  9. colnames(df) <- c("name", "alpha", "beta", "gamma", "rho", "id", "group")
  10. df <- tibble::column_to_rownames(df, var = "name")
  11. df
  12. var1 var2 var3 var4 id group
  13. Sample1_x2 10 23 6 5 Sample1 after
  14. Sample2_x2 8 53 22 52 Sample2 after
  15. Sample1_x1 12 2 44 15 Sample1 before
  16. Sample3_x1 27 46 16 65 Sample3 before
  17. Sample2_x1 41 44 27 25 Sample2 before
  18. Sample3_x2 5 38 9 29 Sample3 after

我想通过计算每个样本的'id',每个变量列的'after - before'来获得变化的数据框。所需输出如下:

  1. id alpha beta gamma rho
  2. Sample1 -2 21 -38 -10
  3. Sample2 -33 9 -5 27
  4. Sample3 -22 -8 -7 -36

我尝试使用dplyr::group_by(id, group),但在mutate()部分无法成功计算每个样本的差异。谢谢您提前的帮助。

  1. <details>
  2. <summary>英文:</summary>
  3. I have a dataframe in a similar structure of the example below

df <- data.frame(rbind(c("Sample1_x2", 10, 23, 6, 5, "Sample1", "after"),
c("Sample2_x2", 8, 53, 22, 52, "Sample2", "after"),
c("Sample1_x1", 12, 2, 44, 15, "Sample1", "before"),
c("Sample3_x1", 27, 46, 16, 65, "Sample3", "before"),
c("Sample2_x1", 41, 44, 27, 25, "Sample2", "before"),
c("Sample3_x2", 5, 38, 9, 29, "Sample3", "after")))
colnames(df) <- c("name", "alpha", "beta", "gamma", "rho", "id", "group")
df <- tibble::column_to_rownames(df, var = "name")
df
var1 var2 var3 var4 id group
Sample1_x2 10 23 6 5 Sample1 after
Sample2_x2 8 53 22 52 Sample2 after
Sample1_x1 12 2 44 15 Sample1 before
Sample3_x1 27 46 16 65 Sample3 before
Sample2_x1 41 44 27 25 Sample2 before
Sample3_x2 5 38 9 29 Sample3 after

  1. I want to get the change dataframe by calculating &#39;after - before&#39; for each sample by `id`, for each variable column (they are not numeric, and each numeric column has different name). Desired output is:
  1. id alpha beta gamma rho

Sample1 -2 21 -38 -10
Sample2 -33 9 -5 27
Sample3 -22 -8 -7 -36

  1. I was trying to use `dplyr::group_by(id, group)` but could not succeed in `mutate()` part to calculate the difference for each sample. Thank you in advance.
  2. </details>
  3. # 答案1
  4. **得分**: 3
  5. 你可以在 `data.table` 中使用以下方法:
  6. ```R
  7. library(data.table)
  8. setDT(df)[order(-group), lapply(.SD, \(s) diff(as.numeric(s))), id, .SDcols=1:4]

输出:

  1. id alpha beta gamma rho
  2. 1: Sample1 -2 21 -38 -10
  3. 2: Sample3 -22 -8 -7 -36
  4. 3: Sample2 -33 9 -5 27

dplyr 中,相应的方法如下:

  1. library(dplyr)
  2. df %>%
  3. arrange(desc(group)) %>%
  4. reframe(across(-group, ~diff(as.numeric(.x))), .by=id)
英文:

You could use this approach in data.table

  1. library(data.table)
  2. setDT(df)[order(-group), lapply(.SD, \(s) diff(as.numeric(s))), id, .SDcols=1:4]

Output:

  1. id alpha beta gamma rho
  2. 1: Sample1 -2 21 -38 -10
  3. 2: Sample3 -22 -8 -7 -36
  4. 3: Sample2 -33 9 -5 27

An equivalent approach in dplyr is as follows:

  1. library(dplyr)
  2. df %&gt;%
  3. arrange(desc(group)) %&gt;%
  4. reframe(across(-group, ~diff(as.numeric(.x))), .by=id)

答案2

得分: 2

这是一个 dplyr 的选项:

  1. library(dplyr)
  2. df %>%
  3. readr::type_convert() %>%
  4. summarise(across(where(is.numeric), ~ .x[group == "after"] - .x[group == "before"]),
  5. .by = id)
  6. # id alpha beta gamma rho
  7. # 1 Sample1 -2 21 -38 -10
  8. # 2 Sample2 -33 9 -5 27
  9. # 3 Sample3 -22 -8 -7 -36
英文:

This is one dplyr option:

  1. library(dplyr)
  2. df %&gt;%
  3. readr::type_convert() %&gt;%
  4. summarise(across(where(is.numeric), ~ .x[group == &quot;after&quot;] - .x[group == &quot;before&quot;]),
  5. .by = id)
  6. # id alpha beta gamma rho
  7. # 1 Sample1 -2 21 -38 -10
  8. # 2 Sample2 -33 9 -5 27
  9. # 3 Sample3 -22 -8 -7 -36

答案3

得分: 1

以下是您要翻译的内容:

  1. library(dplyr)
  2. df %>%
  3. group_by(id) %>%
  4. arrange(group, .by_group = TRUE) %>%
  5. type.convert(as.is = TRUE) %>%
  6. summarise(across(-c(group, name), ~first(.)-last(.))) %>%
  7. ungroup()
  8. # dplyr >= 1.1.0
  9. df %>%
  10. arrange(group) %>%
  11. type.convert(as.is = TRUE) %>%
  12. summarise(across(-c(group, name), ~first(.)-last(.)), .by=id)
  13. # See @langtang's solution who uses reframe very elegantly instead of summarise!
  14. id alpha beta gamma rho
  15. <chr> <int> <int> <int> <int>
  16. 1 Sample1 -2 21 -38 -10
  17. 2 Sample2 -33 9 -5 27
  18. 3 Sample3 -22 -8 -7 -36

希望这有所帮助!

英文:

Update after clarification (removed first answer):

  1. library(dplyr)
  2. df %&gt;%
  3. group_by(id) %&gt;%
  4. arrange(group, .by_group = TRUE) %&gt;%
  5. type.convert(as.is = TRUE) %&gt;%
  6. summarise(across(-c(group, name), ~first(.)-last(.))) %&gt;%
  7. ungroup()
  8. # dplyr &gt;= 1.1.0
  9. df %&gt;%
  10. arrange(group) %&gt;%
  11. type.convert(as.is = TRUE) %&gt;%
  12. summarise(across(-c(group, name), ~first(.)-last(.)), .by=id)
  13. # See @langtang&#39;s solution who uses reframe very elegantly instead of summarise!
  14. id alpha beta gamma rho
  15. &lt;chr&gt; &lt;int&gt; &lt;int&gt; &lt;int&gt; &lt;int&gt;
  16. 1 Sample1 -2 21 -38 -10
  17. 2 Sample2 -33 9 -5 27
  18. 3 Sample3 -22 -8 -7 -36

huangapple
  • 本文由 发表于 2023年5月17日 07:06:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/76267615.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定