使用 dplyr 处理 df
process df with ddplyr
我的 df 是这样的:
L T m EI f.1 f.4 f.6 f.5 f.9
1 10 1.0 6.190004 9988.997 6.59710 13.38665 20.55083 28.25382 36.63822
6 10 3.5 6.190004 9988.997 12.11441 24.33067 36.74911 49.46745 62.58052
19 25 1.0 6.190004 9988.997 2.57757 5.16730 7.78128 10.43146 13.12981
24 25 3.5 6.190004 9988.997 4.79088 9.58822 14.39848 19.22824 24.08453
现在我想用 ddplyr
按照以下步骤处理这个 df,转义循环结构。
使用函数创建新的命名列:le。? = fun(f.?)(其中 ?
为 1,4,6,5,9。列名如 le.?
。le
后面的数字可能会在另一个过程。
根据参数L, T, f.?
求解一个方程enfoo
,每个方程的根绑定到df
我在这个过程中遇到的问题是:
- 如何分割以
f.?
命名的列并使用 ddplyr
创建新列?
- 如何根据 clomuns
le.?
在哪里对列 f.?
进行切片?相同的数字?
如果我正确理解了这个问题,那么这可能会有所帮助。
请注意,出于演示目的,我在 f.*
列上应用了一个简单的函数来创建 le.*
列。即 l.* = (f.*) / 2
.
在下面的代码中,您可以通过调整 funs
参数将这个简单的函数替换为您定义的函数。
library(dplyr)
df %>%
mutate_at(vars(f.1:f.9), funs(le=./2)) %>%
rename_at(vars(f.1_le:f.9_le), funs(gsub("[a-zA-Z]+[.](\d+)[_](\S+)","\2.\1",.)))
输出为:
L T m EI f.1 f.4 f.6 f.5 f.9 le.1 le.4 le.6 le.5
1 10 1.0 6.190004 9988.997 6.59710 13.38665 20.55083 28.25382 36.63822 3.298550 6.693325 10.27542 14.12691
2 10 3.5 6.190004 9988.997 12.11441 24.33067 36.74911 49.46745 62.58052 6.057205 12.165335 18.37456 24.73372
3 25 1.0 6.190004 9988.997 2.57757 5.16730 7.78128 10.43146 13.12981 1.288785 2.583650 3.89064 5.21573
4 25 3.5 6.190004 9988.997 4.79088 9.58822 14.39848 19.22824 24.08453 2.395440 4.794110 7.19924 9.61412
le.9
1 18.319110
2 31.290260
3 6.564905
4 12.042265
示例数据:
df <- structure(list(L = c(10L, 10L, 25L, 25L), T = c(1, 3.5, 1, 3.5
), m = c(6.190004, 6.190004, 6.190004, 6.190004), EI = c(9988.997,
9988.997, 9988.997, 9988.997), f.1 = c(6.5971, 12.11441, 2.57757,
4.79088), f.4 = c(13.38665, 24.33067, 5.1673, 9.58822), f.6 = c(20.55083,
36.74911, 7.78128, 14.39848), f.5 = c(28.25382, 49.46745, 10.43146,
19.22824), f.9 = c(36.63822, 62.58052, 13.12981, 24.08453)), .Names = c("L",
"T", "m", "EI", "f.1", "f.4", "f.6", "f.5", "f.9"), class = "data.frame", row.names = c("1",
"6", "19", "24"))
我的 df 是这样的:
L T m EI f.1 f.4 f.6 f.5 f.9
1 10 1.0 6.190004 9988.997 6.59710 13.38665 20.55083 28.25382 36.63822
6 10 3.5 6.190004 9988.997 12.11441 24.33067 36.74911 49.46745 62.58052
19 25 1.0 6.190004 9988.997 2.57757 5.16730 7.78128 10.43146 13.12981
24 25 3.5 6.190004 9988.997 4.79088 9.58822 14.39848 19.22824 24.08453
现在我想用 ddplyr
按照以下步骤处理这个 df,转义循环结构。
使用函数创建新的命名列:le。? = fun(f.?)(其中
?
为 1,4,6,5,9。列名如le.?
。le
后面的数字可能会在另一个过程。根据参数
L, T, f.?
求解一个方程enfoo
,每个方程的根绑定到df
我在这个过程中遇到的问题是:
- 如何分割以
f.?
命名的列并使用ddplyr
创建新列? - 如何根据 clomuns
le.?
在哪里对列f.?
进行切片?相同的数字?
如果我正确理解了这个问题,那么这可能会有所帮助。
请注意,出于演示目的,我在 f.*
列上应用了一个简单的函数来创建 le.*
列。即 l.* = (f.*) / 2
.
在下面的代码中,您可以通过调整 funs
参数将这个简单的函数替换为您定义的函数。
library(dplyr)
df %>%
mutate_at(vars(f.1:f.9), funs(le=./2)) %>%
rename_at(vars(f.1_le:f.9_le), funs(gsub("[a-zA-Z]+[.](\d+)[_](\S+)","\2.\1",.)))
输出为:
L T m EI f.1 f.4 f.6 f.5 f.9 le.1 le.4 le.6 le.5
1 10 1.0 6.190004 9988.997 6.59710 13.38665 20.55083 28.25382 36.63822 3.298550 6.693325 10.27542 14.12691
2 10 3.5 6.190004 9988.997 12.11441 24.33067 36.74911 49.46745 62.58052 6.057205 12.165335 18.37456 24.73372
3 25 1.0 6.190004 9988.997 2.57757 5.16730 7.78128 10.43146 13.12981 1.288785 2.583650 3.89064 5.21573
4 25 3.5 6.190004 9988.997 4.79088 9.58822 14.39848 19.22824 24.08453 2.395440 4.794110 7.19924 9.61412
le.9
1 18.319110
2 31.290260
3 6.564905
4 12.042265
示例数据:
df <- structure(list(L = c(10L, 10L, 25L, 25L), T = c(1, 3.5, 1, 3.5
), m = c(6.190004, 6.190004, 6.190004, 6.190004), EI = c(9988.997,
9988.997, 9988.997, 9988.997), f.1 = c(6.5971, 12.11441, 2.57757,
4.79088), f.4 = c(13.38665, 24.33067, 5.1673, 9.58822), f.6 = c(20.55083,
36.74911, 7.78128, 14.39848), f.5 = c(28.25382, 49.46745, 10.43146,
19.22824), f.9 = c(36.63822, 62.58052, 13.12981, 24.08453)), .Names = c("L",
"T", "m", "EI", "f.1", "f.4", "f.6", "f.5", "f.9"), class = "data.frame", row.names = c("1",
"6", "19", "24"))