#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]