Как заполнить переменную на основе значения другой переменной - PullRequest
1 голос
/ 13 февраля 2020

У меня есть фрейм данных, в котором решение имеет различные составляющие общей сущности. Значение 0 означает, что у него нет этой составляющей, а значение 1 означает, что у него есть эта составляющая. Если имеется более одной составляющей (т.е. более одного значения решения = 1), то в целом = «более одного» и отдельные составляющие декодируются в декодированные переменные.


df1 <- data.frame (solution0 = "0", solution1 = "1", solution2 = "0", solution3 = "1",  overall = "more than one", decoded0 = "", decoded1 = "aluminum", decoded2 = "", decoded3 = "hydrogen")

Если только одно решение = 1 (т. Е. Только одна составляющая), тогда эта составляющая отображается на общее значение, и декодированные переменные являются пустыми, как в двух следующих примерах:

df2 <-  data.frame (solution0 = "0", solution1 = "1", solution2 = "0", solution3 = "0",  overall = "aluminum", decoded0 = "", decoded1 = "", decoded2 = "", decoded3 = "")
df3 <-  data.frame (solution0 = "0", solution1 = "0", solution2 = "0", solution3 = "1",  overall = "hydrogen", decoded0 = "", decoded1 = "", decoded2 = "", decoded3 = "")

Что у меня есть до сих пор:

df1$overall <- case_when(
  sum(df1$solution0 + df1$solution1 + df1$solution2 + df1$solution3) > 1 ~ 'more than one',
  TRUE ~ ''
)

df1$decoded0 <- ifelse(df1$solution0 == "1" & sum(df1$solution0 + df1$solution1 + df1$solution2 + df1$solution3) > 1, "lithium", "")

df1$decoded1 <- ifelse(df1$solution1 == "1" & sum(df1$solution0 + df1$solution1 + df1$solution2 + df1$solution3) > 1, "aluminum", "")

df1$decoded2 <- ifelse(df1$solution2 == "1" & sum(df1$solution0 + df1$solution1 + df1$solution2 + df1$solution3) > 1, "sodium", "")

df1$decoded3 <- ifelse(df1$solution3 == "1" & sum(df1$solution0 + df1$solution1 + df1$solution2 + df1$solution3) > 1, "hydrogen", "")

Я не знаю, как запрограммировать логи c "Если только одно решение = 1 (т.е. только одна составляющая), а остальные = 0, то эта составляющая с = 1 отображается на все "в первом случае case_when.

1 Ответ

0 голосов
/ 13 февраля 2020

Вы можете рассчитать построчную сумму для столбцов, начинающихся с "solution", и присвоить значения столбцу overall.

library(dplyr)

apply_fun <- function(df) {

  df %>%
    type.convert(as.is = TRUE) %>%
    mutate(rs = rowSums(select(., starts_with('solution'))), 
           overall = case_when(rs > 1 ~ 'more than one', 
                               solution0 == 1~ "lithium",
                               solution1 == 1~ "aluminum",
                               solution2 == 1~ "sodium",
                               solution3 == 1~ "hydrogen",
                               TRUE ~ '')) %>%
   select(-rs)
}

Мы можем передать фрейм данных вышеупомянутой функции.

apply_fun(df1)
#  solution0 solution1 solution2 solution3       overall decoded0 decoded1 decoded2 decoded3
#1         0         1         0         1 more than one       NA aluminum       NA hydrogen

apply_fun(df2)
#  solution0 solution1 solution2 solution3   overall decoded0 decoded1 decoded2 decoded3
#1         0         1         0         0  aluminum          NA       NA       NA       NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...