【问题标题】:Create new column based on 4 values in another column根据另一列中的 4 个值创建新列
【发布时间】:2011-10-05 07:58:34
【问题描述】:

我想根据另一列中的 4 个值创建一个新列。

if col1=1 then col2= G;
if col1=2 then col2=H;
if col1=3 then col2=J;
if col1=4 then col2=K.

我如何在 R 中做到这一点? 请我需要有人帮助解决这个问题。我已经尝试过 if/else 和 ifelse 但似乎都没有工作。谢谢

【问题讨论】:

标签: r if-statement


【解决方案1】:

你可以使用嵌套的ifelse:

col2 <- ifelse(col1==1, "G",
        ifelse(col1==2, "H",
        ifelse(col1==3, "J",
        ifelse(col1==4, "K",
                        NA  )))) # all other values map to NA

在这种简单的情况下,它是矫枉过正的,但对于更复杂的情况......

【讨论】:

  • "但对于更复杂的..." -- 更复杂的嵌套ifelse 是一个更好 的想法?这对我来说是违反直觉的。
  • @TheRedPea 对于更复杂的条件,基于不同的列,互不相关等。一行一个条件。
  • 是的,我想人们可能别无选择,只能用 if 语句来表达逻辑。
【解决方案2】:

有很多方法可以做到这一点,但这里有一种。

set.seed(357)
mydf <- data.frame(col1 = sample(1:4, 10, replace = TRUE))
mydf$col2 <- rep(NA, nrow(mydf))
mydf[mydf$col1 == 1, ][, "col2"] <- "A"
mydf[mydf$col1 == 2, ][, "col2"] <- "B"
mydf[mydf$col1 == 3, ][, "col2"] <- "C"
mydf[mydf$col1 == 4, ][, "col2"] <- "D"

   col1 col2
1     1    A
2     1    A
3     2    B
4     1    A
5     3    C
6     2    B
7     4    D
8     3    C
9     4    D
10    4    D

这是一个使用carrecode

library(car)
mydf$col3 <- recode(mydf$col1, "1" = 'A', "2" = 'B', "3" = 'C', "4" = 'D')

来自this question的另一个:

mydf$col4 <- c("A", "B", "C", "D")[mydf$col1]

【讨论】:

    【解决方案3】:

    您有一种特殊情况,即查找索引为整数 1:4 的值。这意味着您可以使用矢量索引一步来解决您的问题。

    首先,创建一些示例数据:

    set.seed(1)
    dat <- data.frame(col1 = sample(1:4, 10, replace = TRUE))
    

    接下来,定义查找值,并使用[ 子集来查找所需的结果:

    values <- c("G", "H", "J", "K")
    dat$col2 <- values[dat$col1]
    

    结果:

    dat
       col1 col2
    1     2    H
    2     2    H
    3     3    J
    4     4    K
    5     1    G
    6     4    K
    7     4    K
    8     3    J
    9     3    J
    10    1    G
    

    更一般地,您可以使用[ 子集结合match 来解决此类问题:

    index <- c(1, 2, 3, 4)
    values <- c("G", "H", "J", "K")
    dat$col2 <- values[match(dat$col1, index)]
    dat
       col1 col2
    1     2    H
    2     2    H
    3     3    J
    4     4    K
    5     1    G
    6     4    K
    7     4    K
    8     3    J
    9     3    J
    10    1    G
    

    【讨论】:

    • 我发现最后一个替代方案对我有用并给了我我需要的东西:dat$col2
    【解决方案4】:

    你可以看看?symnum

    在你的情况下,类似于:

    col2<-symnum(col1, seq(0.5, 4.5, by=1), symbols=c("G", "H", "J", "K"))
    

    应该让你靠近。

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 2020-04-16
      • 2022-08-12
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2020-04-28
      • 1970-01-01
      相关资源
      最近更新 更多