我有一个包含多个列的数据帧(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
现在,对于val2
和val3
列,我还想在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方法是什么?
答案 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));