【发布时间】:2020-09-21 12:41:01
【问题描述】:
我是 R 新手,因此非常感谢您对任何代码的更多解释,以帮助解决我的问题。
我有一个 data.frame,其中包含彼此相关的列组,我想对这些组中的每一个执行计算以获取新的输出列。例如,在实验中的许多生物学重复,我想在折叠它们之前独立地对每个重复进行计算。
我知道我可以在 dplyr 中使用 mutate 来创建新列,但我不确定如何在循环中执行此操作或如何使用 lapply 类型策略来避免每次重新绑定列名。我最大的问题是了解如何将列名转换为这些策略之一可用的东西。
例如:
> A.1 <- c(11,12,13,4,15,6,17,18)
> A.2 <- c(2,4,5,5,19,7,5,1)
>
> B.1 <- c (3,4,5,1,31,76,13,70)
> B.2 <- c (10,9,8,15,31,12,13,12)
>
> C.1 <- c(1,2,3,4,5,6,7,8)
> C.2 <- c(2,4,5,8,10,12,15,18)
>
> df <- data.frame(A.1, A.2, B.1, B.2, C.1, C.2)
>
> df
A.1 A.2 B.1 B.2 C.1 C.2
1 11 2 3 10 1 2
2 12 4 4 9 2 4
3 13 5 5 8 3 5
4 4 5 1 15 4 8
5 15 19 31 31 5 10
6 6 7 76 12 6 12
7 17 5 13 13 7 15
8 18 1 70 12 8 18
>
我想在 A.new = A.1/A.2、B.new = B.1/B.2 等处创建新列,而无需明确输入每个列名。另请注意,“A”和“B”实际上是字符串,因此将它们全部输入会非常麻烦且耗时。
类似这样,但对于许多列组来说是一般情况:
> df <- df %>% mutate(A.new = A.1/A.2)
> df <- df %>% mutate(B.new = B.1/B.2)
> df <- df %>% mutate(C.new = C.1/C.2)
>
> df
A.1 A.2 B.1 B.2 C.1 C.2 A.new B.new C.new
1 11 2 3 10 1 2 5.5000000 0.30000000 0.5000000
2 12 4 4 9 2 4 3.0000000 0.44444444 0.5000000
3 13 5 5 8 3 5 2.6000000 0.62500000 0.6000000
4 4 5 1 15 4 8 0.8000000 0.06666667 0.5000000
5 15 19 31 31 5 10 0.7894737 1.00000000 0.5000000
6 6 7 76 12 6 12 0.8571429 6.33333333 0.5000000
7 17 5 13 13 7 15 3.4000000 1.00000000 0.4666667
8 18 1 70 12 8 18 18.0000000 5.83333333 0.4444444
>
我还没有在这里看到我的问题的答案,但如果您能指出我现有的答案,将不胜感激!我目前正在考虑将列名包含在变量中,但也许这不是解决这个问题的正确方法(R 也是我正在学习的第一种编程语言),所以我对答案的搜索还没有产生太多结果。
提前感谢您的指导!
【问题讨论】:
-
如果要使用
dplyr,那就比较麻烦了; this question 和 this question 是很好的起点。但我怀疑如果你的数据采用更长、更整洁的格式,事情会容易得多:有一个包含“A”、“B”、“C”等的group列和一个包含“A”、“B”、“C”等的replicate列“1”、“2”等
标签: r loops dataframe dplyr lapply