Добавление константы в столбец dataframe условно для другого столбца - PullRequest
0 голосов
/ 30 октября 2018

Я хочу добавить константу в строки нового столбца, которые соответствуют определенному условию в другом столбце.

Мои смоделированные данные:

df <- structure(list(var1 = c("a", "b", "c", "a", "a", "a", "a", "d"), 
                 var2 = c("b", "b", "a", "b", "b", "c", "a", "c"), 
                 var2 = c("c", "c", "c", "c", "d", "c", "c", "a")), 
            .Names = c("var1", "var2", "var3"), 
            row.names = c(NA, 8L), 
            class = "data.frame")

, который выглядит так:

> df
  var1 var2 var3
1    a    b    c
2    b    b    c
3    c    a    c
4    a    b    c
5    a    b    d
6    a    c    c
7    a    a    c
8    d    c    a

Теперь я хотел бы добавить newvar, которое увеличивается на значение 1, если var1 равно a, увеличить его еще на 1, если var2 равно b, и увеличить его на 1, если var3 равно c. То есть мои данные должны выглядеть так:

> df
  var1 var2 var3 newvar
1    a    b    c      3
2    b    b    c      2
3    c    a    c      1
4    a    b    c      3
5    a    b    d      2
6    a    c    c      2
7    a    a    c      2
8    d    c    a      0

Я пробовал следующее, но он только заменит значения на 1, а не увеличит их на 1:

df$newvar[df$var1 == "a"] <- +1
df$newvar[df$var1 == "b"] <- +1
df$newvar[df$var1 == "c"] <- +1

Ответы [ 4 ]

0 голосов
/ 30 октября 2018

Мы можем использовать rowSums

df$newVar <- rowSums(df == c('a', 'b', 'c')[col(df)])
df$newVar
#[1] 3 2 1 3 2 2 2 0
0 голосов
/ 30 октября 2018

Быстрый путь следования по вашему пути и использование базы R:

df$newVar = 0
df$newVar[df$var1 == "a"] <- df$newVar[df$var1 == "a"] +1
df$newVar[df$var2 == "b"] <- df$newVar[df$var2 == "b"] +1
df$newVar[df$var3 == "c"] <- df$newVar[df$var3 == "c"] +1
0 голосов
/ 30 октября 2018

Другой способ, который использует ifelse и mutate вместо rowwise решения выше, будет:

    library(dplyr)
    df %>% mutate(newVar = ifelse(var1 == "a",1,0) + ifelse(var2 == "b",1,0) + 
                           ifelse(var3 == "c",1,0))

Затем вы можете настроить константы на любое значение, которое вам нравится. Если вы хотите включить новый столбец в ваш фрейм данных, просто присвойте результат мутирования вашему фрейму данных:

    df <- df %>% 
           mutate(newVar = ifelse(var1 == "a",1,0) + ifelse(var2 ==
                    "b",1,0) + ifelse(var3 == "c",1,0))
0 голосов
/ 30 октября 2018

Мы можем использовать rowwise в dplyr и подсчитать количество условий, которые выполняются для каждой строки.

library(dplyr)
df %>%
  rowwise() %>%
  mutate(new_var = sum(c(var1 == "a", var2 == "b" , var3 == "c")))

#  var1  var2  var3  new_var
#  <chr> <chr> <chr>   <int>
#1 a     b     c           3
#2 b     b     c           2
#3 c     a     c           1
#4 a     b     c           3
#5 a     b     d           2
#6 a     c     c           2
#7 a     a     c           2
#8 d     c     a           0

Или базовый метод R

df$new_var <- Reduce("+", list(df$var1 == "a", df$var2 == "b", df$var3 == "c"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...