Вот два решения:
df$diff <- lapply(df$month, function(a) sum(diff(as.numeric(a)))/2)
df
# id month diff
# 1 1 1, 2, 3 1
# 2 2 3, 5, 7 2
Одна загвоздка в том, что, хотя она выглядит как обычный столбец, это не совсем то, что вы могли ожидать:
df$diff[1]
# [[1]]
# [1] 1
Это list
одного элемента, где вы можете ожидать скаляр (или вектор длины 1, в случае R). Альтернативой (как предложил JilberUrbina) является использование sapply
в тех случаях, когда вы ожидаете, что результат будет иметь длину 1:
df$diff2 <- sapply(df$month, function(a) sum(diff(as.numeric(a)))/2)
df$diff2[1]
# [1] 1
Если вы иначе используете набор инструментов tidyverse
(который многие рекомендуют), попробуйте следующее:
library(dplyr)
library(purrr)
df %>%
mutate(
diff = map(month, ~ sum(diff(as.numeric(.)))/2)
)
# id month diff
# 1 1 1, 2, 3 1
# 2 2 3, 5, 7 2
Если вы сохраните его в tibble
по умолчанию *1019*, оно будет выглядеть так:
tbl_df(df) %>%
mutate(
diff = map(month, ~ sum(diff(as.numeric(.)))/2)
)
# # A tibble: 2 x 3
# id month diff
# <int> <list> <list>
# 1 1 <chr [3]> <dbl [1]>
# 2 2 <chr [3]> <dbl [1]>
хотя это фактически одно и то же. Если вы планируете многократно хранить списки или другие сложные вещи в столбце (например, lm
модель, predict
ионы), то это может быть очень удобным и, возможно, в конечном итоге интуитивно понятным.