使用ddplyr处理df

时间:2018-03-05 03:29:55

标签: r plyr

我的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后面的数字可能会改变。过程

  • 根据参数enfoo求解方程L, T, f.?,每个方程的根绑定到df

我在这个问题上遇到的问题是:

  1. 如何对以f.?命名的列进行切片并使用ddplyr创建新列?
  2. 如何根据clomuns f.?对哪些列le.?进行切片?相同的数字?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,那么这可能有所帮助。

请注意,出于演示目的,我在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"))