使用mutate_at在每列之后插入相对值(相对于tibble的第二列)

时间:2018-03-12 15:26:03

标签: r dplyr mutate tibble

我有一个包含多个列的数据帧(tibble),对于前两个列之后的每个列,我想保留绝对值,但也要插入相对于第二列的值。 例如,我从以下数据框开始(列名可能会有所不同!):

df = tibble(val1 = 5:10, val2 = 10:15, val3 = 15:20); df
# A tibble: 6 x 3
   val1  val2  val3
  <int> <int> <int>
1     5    10    15
2     6    11    16
3     7    12    17
4     8    13    18
5     9    14    19
6    10    15    20

现在,对于val2val3列,我还想在val2之后和val3之后插入一个列,显示相对于{{1}的值}。我怎么能这样做?

产生的结果应如下所示:

val1

不幸的是,我无法编写正确的mutate_at调用来在每个值列之后插入该相对列。事实上,我无法使用funs()来编写mutate_at,它通过访问其他列(按位置而不是名称)来修改列。

用相对值替换val2和val3(使用lambda函数而不是funs),但不保留原始的val2和val3列:

dfrel = tibble(val1 = 5:10, val2 = 10:15, rel2 = val2/val1, val3 = 15:20, rel3 = val3/val1)
dfrel
# A tibble: 6 x 5
   val1  val2  rel2  val3  rel3
  <int> <int> <dbl> <int> <dbl>
1     5    10  2.00    15  3.00
2     6    11  1.83    16  2.67
3     7    12  1.71    17  2.43
4     8    13  1.62    18  2.25
5     9    14  1.56    19  2.11
6    10    15  1.50    20  2.00

我尝试使用df %>% mutate_at(vars(-1), function(v) v/.[[1]]) # A tibble: 6 x 3 val1 val2 val3 <int> <dbl> <dbl> 1 5 2.00 3.00 2 6 1.83 2.67 3 7 1.71 2.43 4 8 1.62 2.25 5 9 1.56 2.11 6 10 1.50 2.00 失败了:

funs()

Using functions of multiple columns in a dplyr mutate_at call相比,一个复杂因素是我的val1列没有固定名称(即它并不总是被称为df %>% mutate_at(vars(-1), funs(./.tbl[[1]])) Error in mutate_impl(.data, dots) : Evaluation error: object '.tbl' not found. df %>% mutate_at(vars(-1), funs(function(v) v/.[[1]])) Error in mutate_impl(.data, dots) : Column `val2` is of unsupported type function ),所以我不能在funs参数中按名称使用它。另一个复杂因素是即时创建(使用大量管道运算符)并且通常不存储在变量中,因此我不能简单地除以df [[1]] ......

那么,在每列之后插入相对列(即第一列的百分比)的正确dplyr方法是什么?

2 个答案:

答案 0 :(得分:1)

通过将其包装在列表中为您的函数命名,因此mutate_at将创建新列。类似于以下内容(列名称可能不太理想,因此您可能需要在需要时重命名):

df %>% mutate_at(vars(-1), list(rel = function(v) v / .[[1]]))

# A tibble: 6 x 5
#   val1  val2  val3 val2_rel val3_rel
#  <int> <int> <int>    <dbl>    <dbl>
#1     5    10    15     2.00     3.00
#2     6    11    16     1.83     2.67
#3     7    12    17     1.71     2.43
#4     8    13    18     1.62     2.25
#5     9    14    19     1.56     2.11
#6    10    15    20     1.50     2.00

答案 1 :(得分:0)

在Psidom的帮助下,这是我对问题的最终解决方案:

AmazonS3 s3 = AmazonS3Client.standard();
s3.putObject(new PutObjectRequest()
    // this will default to AES-256...no KMS Client key used
    .withSSEAwsKeymanagementParams(new SSEAwsKeyManagementParams()) 
    // alternative if you are looking to do SSE with a Client Master Key from KMS
    //.withSSEAwsKeymanagementParams(new SSEAwsKeyManagementParams(...KMS Key Alias or ARN...)) 
    .withKey(myKey)
    .withFile(myFile));