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

38

我想根据另一列中的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 了,但似乎都不起作用。谢谢。


你使用的编程语言是什么? - The GiG
3
@TheGiG OP使用[tag:r]标记了这个问题。 - Andrie
高度关联:case 语句的等价物如何在 data.frame 中添加列?Excel 表格中的数据清理(该问题中还有一组链接)。 - Marek
4个回答

39

您可以使用嵌套的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

在这个简单的例子中,使用它有点过头了,但对于更复杂的情况...


1
但对于更复杂的情况,嵌套的 ifelse 会是一个更好的选择吗?这对我来说并不直观。 - Nate Anderson
@TheRedPea 对于更复杂的条件,基于不同的列,彼此之间没有关联等情况,每个条件需要一行。 - Marek
是的,我想一个人可能没有选择,只能用if语句来表达逻辑。 - Nate Anderson

25

您有一个特殊情况,需要查找索引为整数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 <- values[match(dat$col1, index)] - ChuckCottrill

8
有许多方法可以做到这一点,但这里有一个例子。
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')

来自这个问题的另一个例子:

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

1
你可以看一下?symnum
在你的情况下,可以这样做:
col2<-symnum(col1, seq(0.5, 4.5, by=1), symbols=c("G", "H", "J", "K"))

这应该能让你接近。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接