我有以下数据框(很抱歉,没有提供带有dput的示例,当我将其粘贴到此处时,它似乎不适用于列表):
现在,我正在尝试创建一个新列y
,该列将mnt_ope
的每个元素用于ref_amount
和ref_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"))
答案 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