创建一个长度与另一个相同的新向量,并基于第三个值

时间:2018-02-04 03:28:22

标签: r dataframe subset

现有数据框ww有两个向量,XY,两个字符(这可能无关紧要,但我只是声明它)。

现在我需要:在同一数据框ZZ中创建第三个向量ww,即:

  1. 只要X(我想我可以使用length.out=length(x),但不知道如何构建它)

  2. Y有四个不同的值("M1""M2""M3""M4")。如果Y == "M1"Y == "M4"ZZ ="C"。如果Y == "M2"Y == "M3",则ZZ = "V"

4 个答案:

答案 0 :(得分:1)

一种选择是使用包中的case_when来创建ZZ列。

dat <- data.frame(X = c("a", "b", "c", 'd'),
                  Y = c("M1", "M2", "M3", "M4"),
                  stringsAsFactors = FALSE)
dat
#   X  Y
# 1 a M1
# 2 b M2
# 3 c M3
# 4 d M4

library(dplyr)

dat2 <- dat %>%
  mutate(ZZ = case_when(
    Y %in% c("M1", "M4")   ~ "C",
    Y %in% c("M2", "M3")   ~ "V",
    TRUE                   ~ NA_character_
  ))
dat2
#   X  Y ZZ
# 1 a M1  C
# 2 b M2  V
# 3 c M3  V
# 4 d M4  C

答案 1 :(得分:1)

使用base R我们可以使用ifelse语句:

transform(dat,ZZ=ifelse(Y%in%c("M1","M4"),"C","V"))
  X  Y ZZ
1 a M1  C
2 b M2  V
3 c M3  V
4 d M4  C

dat$ZZ=ifelse(dat$Y%in%c("M1","M4"),"C","V")
dat
  X  Y ZZ
1 a M1  C
2 b M2  V
3 c M3  V
4 d M4  C

答案 2 :(得分:1)

以下是使用ifelse

的另一种选择
ww <- data.frame(X = c("a", "b", "c", 'd'),
                 Y = c("M1", "M2", "M3", "M4"),
                 stringsAsFactors = FALSE)

## Adding the ZZ column
ww2 <- cbind(ww,
             ZZ = ifelse(ww$Y %in% c("M1", "M4"), "C", "V"))

请注意,在这种情况下,当ZZ "V"Y时,"M1"会获取值"M4"(假设然后它只能是"M2""M3")。为了更安全但更慢的解决方案:

## Adding the empty ZZ column
ww2 <- cbind(ww, ZZ = rep("NA", nrow(ww)))
## Filling ZZ
ww2$ZZ <- ifelse(ww$Y %in% c("M1", "M4"), "C", NA)
ww2$ZZ <- ifelse(ww$Y %in% c("M2", "M3"), "V", NA)

答案 3 :(得分:1)

另一种方法是使用因素:

dat$zz = factor(dat$Y, levels = c("M1", "M2", "M3", "M4"))
levels(dat$zz) = c('C', 'V', 'V', 'C')