Деление учитывает только определенные группы

#r

#r

Вопрос:

Пример данных

 Var1 <- rep(c("X", "Y", "Z"),2)
Var2 <- rep(c("A","B"),3)
Count<-sample(c(10:100), 6)
data<-data.frame(Var1,Var2,Count)
 

Производит

    Var1 Var2 Count
1    X    A    89
2    Y    B    97
3    Z    A    29
4    X    B    38
5    Y    A    50
6    Z    B    88
 

Я хотел бы разделить количество только Var2 B на два, чтобы получить

    Var1 Var2 Count Count2
1    X    A    89    89
2    Y    B    97    48.5
3    Z    A    29    29
4    X    B    38    19
5    Y    A    50    50
6    Z    B    88    44
 

Но я не уверен, как разделить только на основе переменной.

Я новичок в программировании, поэтому любая помощь приветствуется!

Комментарии:

1. В базе R: df$Count2 = ifelse(df$Var2 == "B", df$Count/ 2, df$Count)

2. Спасибо! Я знал, что это должно быть что-то вроде ifelse, но не мог с этим справиться!

3. within(mydf, { Count2 <- Count; Count2[Var2 == "B"] <- Count2[Var2 == "B"]/2 })

Ответ №1:

Базовое решение R:

 data$Count2 <- data$Count  ## copy to new variable
## Then change the subset to desired value. LHS subsets, RHS provides change
data$Count2[data$Var2 == "B"] <- data$Count[data$Var2 == "B"]/2
 

И решение Tidyverse / dplyr

 library(dplyr)
data = data %>%
      mutate(Count2 = ifelse(Var2 == "B", Count/2, Count ))

# alternatively, this is identical to above
data = mutate(data, Count2 = ifelse(Var2 == "B", Count/2, Count ))
 

Ответ №2:

Небольшое изменение решения dplyr Брайана, используйте replace для обновления части столбца внутри mutate функции.

 require(tidyverse)

Var1 <- rep(c("X", "Y", "Z"),2)
Var2 <- rep(c("A","B"),3)
Count<-sample(c(10:100), 6)
data<-data.frame(Var1,Var2,Count)

data %<>%
  mutate(Count=replace(Count, Var2=='B', Count[Var2=='B']/2))

 

Ответ №3:

С data.table

 library(data.table)
setDT(data)[, Count := as.numeric(Count)][Var2 == 'B', Count := Count/2]