创建一个新的数据框列,该列是其他列的组合

时间:2019-07-31 14:05:27

标签: r dataframe

我有3列a,b,c,我想借助以下列将它们合并成一个新列:

如果mod = 1,则来自a

的数据

如果mod = 2,则来自b的数据

如果mode = 3,则来自c的数据

示例

    mode     a     b      c
      1      2     3      4
      1      5     53    14
      3      2     31    24
      2      12    13    44
      1      20    30     40

输出

    mode     a     b      c       combine
      1      2     3      4          2
      1      5     53    14          5
      3      2     31    24          24
      2      12    13    44          13
      1      20    30     40         20

2 个答案:

答案 0 :(得分:4)

我们可以使用行/列索引来从数据集中获取值。在这里,行seq_len(nrow(df1))和列索引{mode} cbind被创建matrix以从数据集的子集中提取相应的值

df1$combine <- df1[2:4][cbind(seq_len(nrow(df1)), df1$mode)]
df1$combine
#[1]  2  5 24 13 20

数据

df1 <- structure(list(mode = c(1L, 1L, 3L, 2L, 1L), a = c(2L, 5L, 2L, 
12L, 20L), b = c(3L, 53L, 31L, 13L, 30L), c = c(4L, 14L, 24L, 
44L, 40L)), class = "data.frame", row.names = c(NA, -5L))

答案 1 :(得分:1)

R的另一种解决方案,其工作原理是将“模式”转换为字母,然后在匹配的列中提取这些值。

df1$combine <- diag(as.matrix(df1[, letters[df1$mode]]))

还有dplyr()的两种方式。嵌套的if_else

library(dplyr)

df1 %>% 
   mutate(combine = 
       if_else(mode == 1, a, 
            if_else(mode == 2, b, c)
            )
       )

还有case_when()

df1 %>% mutate(combine = 
   case_when(mode == 1 ~ a, mode == 2 ~ b, mode == 3 ~ c)
   )