У меня есть data.frame, как показано ниже:
x <- structure(list(tsv_level = c(2, 3, 2, 3, 2, 2), tsv_payout = structure(list(
c(0, 700, 1400, 2100, 2800), c(0, 300, 600, 900, 1200), c(0,
300, 600, 900, 1200), c(0, 3000, 6000, 9000, 12000), c(0,
700, 1400, 2100, 2800), c(0, 1000, 2000, 3000, 4000)), class = "AsIs")), .Names = c("tsv_level",
"tsv_payout"), row.names = c(NA, -6L), class = c("tbl_df", "tbl",
"data.frame"))
Я хотел бы создать третий столбец, который возвращает элемент tsv_levelth
каждого списка в tsv_payout
.
Я могу сделать это индивидуально, сделав это для строки 1: x$tsv_payout[[1]][2]
и x$tsv_payout[[2]][3]
для строки 2, но как я могу сделать это для всех строк в data.frame?
3 ответа
Вы можете "спрятать" петлю с помощью
x$v = with(x, mapply(`[[`, tsv_payout, tsv_level))
Или аналогичный с transform
.
Ответ Фрэнка работает и полагается только на базу R, но похоже, что rowwise () в пакете dplyr
здесь будет работать.
x %>% rowwise() %>%
mutate(v = tsv_payout[tsv_level])
Не так хорошо, как решение @Frank, но оно также выполняет свою работу:
x$v <- sapply(seq_along(x$tsv_level), function(i) x$tsv_payout[[i]][x$tsv_level[i]])
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.