我有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
答案 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)
)