как назначить половину вектора в г - PullRequest
2 голосов
/ 07 апреля 2020

Поскольку я имею дело с опросом, нет разницы, когда df $ vec3 == 3, и я хочу назначить, когда vec3 == 3, 1 и 2

vec1 <- c("1","2","3","4","5","6")
vec2 <- c("a","s","d","f","g","h")
vec3 <- c("1","2","3","3","3","3")

df <- cbind(vec1,vec2,vec3)
df

     vec1 vec2 vec3
[1,] "1"  "a"  "1" 
[2,] "2"  "s"  "2" 
[3,] "3"  "d"  "3" 
[4,] "4"  "f"  "3" 
[5,] "5"  "g"  "3" 
[6,] "6"  "h"  "3" 

Ожидаемый ответ

   vec1 vec2 vec3 vec4
[1,] "1"  "a"  "1"  "1"
[2,] "2"  "s"  "2"  "2"
[3,] "3"  "d"  "3"  "1" 
[4,] "4"  "f"  "3"  "2" 
[5,] "5"  "g"  "3"  "1"
[6,] "6"  "h"  "3"  "2"

1 Ответ

3 голосов
/ 07 апреля 2020

Мы можем использовать ifelse и повторить 1:2 для количества раз, которое у нас есть vec3 == 3.

transform(df, vec4 = ifelse(vec3 == 3,rep(1:2,length.out = sum(vec3 == 3)), vec3))

#  vec1 vec2 vec3 vec4
#1    1    a    1    1
#2    2    s    2    2
#3    3    d    3    1
#4    4    f    3    2
#5    5    g    3    1
#6    6    h    3    2

Или используя dplyr:

library(dplyr)
df %>%
  mutate(vec4 = ifelse(vec3 == 3, rep(1:2,length.out = sum(vec3 == 3)), vec3))

Или более простой подход с использованием векторной переработки.

df$vec4 <- df$vec3
df$vec4[df$vec4 == 3] <- 1:2

данные

df <- data.frame(vec1,vec2,vec3, stringsAsFactors = FALSE)
...