Dplyr: использовать mutate со столбцами, содержащими списки - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующий фрейм данных (извините за то, что не предоставил пример с dput, кажется, он не работает со списками, когда я вставляю его сюда):

data

Теперь я пытаюсь создать новый столбец 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"))

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

для каждого элемента это работает: нужно добавить цикл:

Например, 5-ая точка данных дт $ mnt_ope [5] -unlist (дт $ ref_amount [5]) выходы:

[1] -0.81  0.00  0.00

с циклом 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
0 голосов
/ 03 июля 2018

Таким способом нельзя вычесть непосредственно из столбца списка, используя 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 для добавления обратно к вашему фрейму данных).

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...