【发布时间】:2019-08-02 15:25:21
【问题描述】:
我认为会扩展到我的问题的My previous question不够具体,所以我再次重新审视:
我的实际数据框有更多列。
library(tidyverse)
# not installed in session but needed to reference:
# laeken::gini
df <- data.frame(a1 = c(1:5),
b1 = c(3,1,3,4,6),
c1 = c(10:14),
a2 = c(9:13),
b2 = c(3:7),
c2 = c(15:19))
> df
a1 b1 c1 a2 b2 c2
1 1 3 10 9 3 15
2 2 1 11 10 4 16
3 3 3 12 11 5 17
4 4 4 13 12 6 18
5 5 6 14 13 7 19
我想使用tidyverse 的mutate 向df 添加一列,这是输出函数my_gini 的结果(如下所示):
my_gini <- function(some_vector){
incs = c(1,2,5,9)
laeken::gini(inc = incs, weights = some_vector)
}
此函数需要采用一个向量,该向量将由来自df 的多个不同列值组成,定义为my_cols:
my_cols = c("b1","c1", "b2","c2")
我怀疑我需要在这里使用purrr,例如:
df %>%
mutate(my_g = pmap_dbl(
select(., my_cols), ~ c(...) %>%
{my_gini(.[my_cols])}
))
应该在df 中添加一列my_g,这样第一行将是:
my_gini(c(3,10, 3,15)) # 32.5564
第二行是:
my_gini(c(1,11,4,16)) # 29.66243
等等。
但是,它不起作用。我收到一个错误:
Error: Result 1 is not a length 1 atomic vector
对sum 执行相同的操作效果很好,所以我不确定为什么它在这里不起作用。
df %>%
mutate(my_g = pmap_dbl(
select(., my_cols), ~ c(...) %>%
{sum(.[my_cols])}
))
提前谢谢你。
【问题讨论】:
-
my_gini返回一个列表,查看my_gini(as.numeric(df[1,my_cols]))和my_gini(as.numeric(df[1,my_cols]))[[1]]之间的区别,因此您的第一个代码可以正常工作,只需将{my_gini(.[my_cols])}更改为{my_gini(.[my_cols])[[1]]} -
谢谢 - 这比使用
unlist更干净。