Dplyr:对包含列表的列使用mutate

时间:2018-07-03 14:03:59

标签: r dplyr

我有以下数据框(很抱歉,没有提供带有dput的示例,当我将其粘贴到此处时,它似乎不适用于列表):

data

现在,我正在尝试创建一个新列y,该列将mnt_ope的每个元素用于ref_amountref_amount之间。结果将是每一行中的一个列表,其中元素的数量与ref_amount的相应值相同。

我尝试过:

data <- data %>%
   mutate( y = mnt_ope - ref_amount)

但是我得到了错误:

Evaluation error: non-numeric argument to binary operator.

使用dput

structure(list(mnt_ope = c(500, 500, 771.07, 770.26, 770.26, 
770.26, 770.72, 770.72, 770.72, 770.72, 770.72, 779.95, 779.95, 
779.95, 779.95, 2502.34, 810.89, 810.89, 810.89, 810.89, 810.89
), ref_amount = list(c(500, 500), c(500, 500), c(771.07, 770.26, 
770.26), c(771.07, 770.26, 770.26), c(771.07, 770.26, 770.26), 
    c(771.07, 770.26, 770.26), c(771.07, 770.26, 770.26), c(771.07, 
    770.26, 770.26), c(771.07, 770.26, 770.26), c(771.07, 770.26, 
    770.26), c(771.07, 770.26, 770.26), c(771.07, 770.26, 770.26
    ), c(771.07, 770.26, 770.26), c(771.07, 770.26, 770.26), 
    c(771.07, 770.26, 770.26), 2502.34, c(810.89, 810.89, 810.89
    ), c(810.89, 810.89, 810.89), c(810.89, 810.89, 810.89), 
    c(810.89, 810.89, 810.89), c(810.89, 810.89, 810.89))), row.names = c(NA, 
-21L), class = c("tbl_df", "tbl", "data.frame"))

2 个答案:

答案 0 :(得分:4)

您不能使用dplyr那样直接从列表列中减去。我发现完成您所引用任务的最佳方法是使用purrr::map。运作方式如下:

data <- data %>% mutate(y = map2(mnt_ope, ref_amount, function(x, y){ x - y }))

或更简洁:

data <- data %>% mutate(y = map2(mnt_ope, ref_amount, ~.x - .y))

map2在这里将两个输入函数应用于两个向量(在您的情况下为数据帧的两列),并将结果作为向量返回(我们正在使用mutate将其追加回您的数据帧) )。

希望有帮助!

答案 1 :(得分:0)

对于每个起作用的元素:需要添加一个循环:

例如第5个数据点     dt $ mnt_ope [5]-取消列出(dt $ ref_amount [5]) 产量:

[1] -0.81  0.00  0.00

with while循环遍历行数(比purrr简单)

i <-0
while(i < nrow(dt)){
  print(dt$mnt_ope[i]-unlist(dt$ref_amount[i]))
  i = i+1
  }

输出:

[1] 0 0
[1] 0 0
[1] 0.00 0.81 0.81
[1] -0.81  0.00  0.00
[1] -0.81  0.00  0.00
[1] -0.81  0.00  0.00
[1] -0.35  0.46  0.46
[1] -0.35  0.46  0.46
[1] -0.35  0.46  0.46
[1] -0.35  0.46  0.46
[1] -0.35  0.46  0.46
[1] 8.88 9.69 9.69
[1] 8.88 9.69 9.69
[1] 8.88 9.69 9.69
[1] 8.88 9.69 9.69
[1] 0
[1] 0 0 0
[1] 0 0 0
[1] 0 0 0
[1] 0 0 0