Как я могу создать новый столбец, взяв значение из существующего столбца и добавив к нему конкретное значение на основе условий из столбца различий?

Как создать новый столбец, добавив значение из существующего столбца на основе условий из другого столбца? Не уверен, как ясно объяснить это, поэтому вот пример...

Вот пример моих данных:

structure(list(id = c(1002L, 650L, 644L, 608L, 718L, 623L, 721L, 
715L, 820L, 616L, 1001L, 634L, 1005L, 821L, 816L, 1021L, 606L, 
824L, 626L, 815L), depth = c(10L, 15L, 10L, 15L, 15L, 10L, 10L, 
20L, 5L, 20L, 5L, 20L, 20L, 10L, 20L, 10L, 20L, 5L, 20L, 20L), 
    duration = c(10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 5L, 
    10L, 5L, 10L, 10L, 10L, 10L, 10L, 10L, 5L, 10L, 10L), catch = c(183L, 
    1216L, 159L, 232L, 1260L, 35L, 149L, 1047L, 907L, 1123L, 
    75L, 800L, 517L, 7L, 958L, 178L, 1127L, 16512L, 504L, 7890L
    ), CPH = c(1098L, 7296L, 954L, 1392L, 7560L, 210L, 894L, 
    6282L, 10884L, 6738L, 900L, 4800L, 3102L, 42L, 5748L, 1068L, 
    6762L, 198144L, 3024L, 47340L), distance = c(771.6666667, 
    771.6666667, 771.6666667, 771.6666667, 771.6666667, 771.6666667, 
    771.6666667, 771.6666667, 385.8333333, 771.6666667, 385.8333333, 
    771.6666667, 771.6666667, 771.6666667, 771.6666667, 771.6666667, 
    771.6666667, 385.8333333, 771.6666667, 771.6666667)), class = "data.frame", row.names = c(NA, 
-20L))

Мне нужно создать новый столбец «totaldist» на основе следующих условий из других существующих столбцов:

ЕСЛИ глубина == 5, то новый столбец 'totaldist' должен быть создан с использованием = Distance+111

ЕСЛИ глубина == 10, тогда 'totaldist' = расстояние+130

ЕСЛИ глубина == 15, тогда 'totaldist' = расстояние+185

ЕСЛИ глубина == 20, тогда 'totaldist' = расстояние+259

Например, для идентификатора 606 с глубиной 20 и расстоянием 771,6667 в новом столбце ("totaldist") должно отображаться значение 1030,667 (расстояние+259).

Я не уверен, следует ли мне использовать if_else или в сочетании с else if, но примеры, которые я нашел с использованием этих функций, у меня не сработали. Должен ли я попробовать это с lapply? Не уверен, как это сделать. Я надеюсь, что это ясно. Благодарю вас!

Без каких-либо пакетов вы можете использовать вложенный ifelse(). Я не уверен, применимо ли это, но если глубины непрерывны или МОГУТ иметь значения между вашими 5, 10 и т. д., Подумайте о том, чтобы ваше утверждение могло справиться с этим.

Pake 05.05.2022 19:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку у вас есть несколько критериев, case_when может быть лучше, чем ifelse.

library(dplyr)

df %>% mutate(totaldist = case_when(depth == 5 ~ distance + 111,
                                    depth == 10 ~ distance + 130,
                                    depth == 15 ~ distance + 185,
                                    depth == 20 ~ distance + 259,
                                    TRUE ~ NA_real_))

     id depth duration catch    CPH distance totaldist
1  1002    10       10   183   1098 771.6667  901.6667
2   650    15       10  1216   7296 771.6667  956.6667
3   644    10       10   159    954 771.6667  901.6667
4   608    15       10   232   1392 771.6667  956.6667
5   718    15       10  1260   7560 771.6667  956.6667
6   623    10       10    35    210 771.6667  901.6667
7   721    10       10   149    894 771.6667  901.6667
8   715    20       10  1047   6282 771.6667 1030.6667
9   820     5        5   907  10884 385.8333  496.8333
10  616    20       10  1123   6738 771.6667 1030.6667
11 1001     5        5    75    900 385.8333  496.8333
12  634    20       10   800   4800 771.6667 1030.6667
13 1005    20       10   517   3102 771.6667 1030.6667
14  821    10       10     7     42 771.6667  901.6667
15  816    20       10   958   5748 771.6667 1030.6667
16 1021    10       10   178   1068 771.6667  901.6667
17  606    20       10  1127   6762 771.6667 1030.6667
18  824     5        5 16512 198144 385.8333  496.8333
19  626    20       10   504   3024 771.6667 1030.6667
20  815    20       10  7890  47340 771.6667 1030.6667

ах! почему я не подумал о case_when, я не знал, что могу использовать это, чтобы добавить такие вещи. Благодарю вас!

FishyFishies 05.05.2022 19:14

Другой способ - присоединиться к таблице поиска:

library(dplyr)

lookup <- data.frame(
  depth = c(5, 10, 15, 20),
  added_dist = c(111, 130, 185, 259)
)

my_df %>% 
  left_join(lookup, 'depth') %>% 
  mutate(totaldist = distance + added_dist)

Это отделяет логику от закодированных значений, что может быть удобно.

Другие вопросы по теме