根据逻辑列的顺序在 DF 中创建多个新列
Creating multiple new columns within a DF depending on the the order of logical columns
我正在尝试创建三个新列,其值取决于三个逻辑类型列的特定顺序。
例如我有这个:
a b c
1 TRUE TRUE TRUE
2 TRUE FALSE TRUE
3 TRUE FALSE TRUE
并且取决于是否遍历行,值是否为 TRUE、TRUE、TRUE,如第 1 行,然后创建三个新列,值为 1、1、1,但如果顺序为 TRUE、FALSE、TRUE,如第 2 行和第 3 行的值将是 2、3、3。请注意,TRUE 的值不等于 1,而是我根据所有三个逻辑值定义的值(总共 8 种可能的组合,每个组合由三个单独的数字定义)。所以我得到这样的东西:
a b c d e f
1 TRUE TRUE TRUE 5 5 2
2 TRUE FALSE TRUE 2 3 3
3 TRUE FALSE TRUE 2 3 3
如果有人能指出正确的方向以尽可能高效地执行此操作,我将不胜感激,因为我对 R 还比较陌生。
如果获取列的值没有逻辑并且您需要为每个组合单独添加条件,您可以使用 if
/else
。
df[c('d', 'e', 'f')] <- t(apply(df, 1, function(x) {
if (x[1] && x[2] && x[3]) c(5, 5, 2)
else if (x[1] && !x[2] && x[3]) c(2, 3, 3)
#add more conditions
#....
}))
df
# a b c d e f
#1 TRUE TRUE TRUE 5 5 2
#2 TRUE FALSE TRUE 2 3 3
#3 TRUE FALSE TRUE 2 3 3
这是一个使用 case_when
的 dplyr
解决方案。在 ~
的左侧定义条件,在 ~
的右侧为满足这些条件时分配一个值。如果不满足条件(即所有 FALSE 值),您将 return NA
。
df %>%
mutate(d =
case_when(
a == TRUE & b == TRUE & c == TRUE ~ 5,
a == TRUE & b == FALSE & c == TRUE ~ 2
),
e =
case_when(
a == TRUE & b == TRUE & c == TRUE ~ 5,
a == TRUE & b == FALSE & c == TRUE ~ 3
),
f =
case_when(
a == TRUE & b == TRUE & c == TRUE ~ 2,
a == TRUE & b == FALSE & c == TRUE ~ 3
))
这给你:
a b c d e f
<lgl> <lgl> <lgl> <dbl> <dbl> <dbl>
1 TRUE TRUE TRUE 5 5 2
2 TRUE FALSE TRUE 2 3 3
3 TRUE FALSE TRUE 2 3 3
数据:
df <- tribble(
~a, ~b, ~c,
TRUE, TRUE, TRUE,
TRUE, FALSE, TRUE,
TRUE, FALSE, TRUE
)
我正在尝试创建三个新列,其值取决于三个逻辑类型列的特定顺序。
例如我有这个:
a b c
1 TRUE TRUE TRUE
2 TRUE FALSE TRUE
3 TRUE FALSE TRUE
并且取决于是否遍历行,值是否为 TRUE、TRUE、TRUE,如第 1 行,然后创建三个新列,值为 1、1、1,但如果顺序为 TRUE、FALSE、TRUE,如第 2 行和第 3 行的值将是 2、3、3。请注意,TRUE 的值不等于 1,而是我根据所有三个逻辑值定义的值(总共 8 种可能的组合,每个组合由三个单独的数字定义)。所以我得到这样的东西:
a b c d e f
1 TRUE TRUE TRUE 5 5 2
2 TRUE FALSE TRUE 2 3 3
3 TRUE FALSE TRUE 2 3 3
如果有人能指出正确的方向以尽可能高效地执行此操作,我将不胜感激,因为我对 R 还比较陌生。
如果获取列的值没有逻辑并且您需要为每个组合单独添加条件,您可以使用 if
/else
。
df[c('d', 'e', 'f')] <- t(apply(df, 1, function(x) {
if (x[1] && x[2] && x[3]) c(5, 5, 2)
else if (x[1] && !x[2] && x[3]) c(2, 3, 3)
#add more conditions
#....
}))
df
# a b c d e f
#1 TRUE TRUE TRUE 5 5 2
#2 TRUE FALSE TRUE 2 3 3
#3 TRUE FALSE TRUE 2 3 3
这是一个使用 case_when
的 dplyr
解决方案。在 ~
的左侧定义条件,在 ~
的右侧为满足这些条件时分配一个值。如果不满足条件(即所有 FALSE 值),您将 return NA
。
df %>%
mutate(d =
case_when(
a == TRUE & b == TRUE & c == TRUE ~ 5,
a == TRUE & b == FALSE & c == TRUE ~ 2
),
e =
case_when(
a == TRUE & b == TRUE & c == TRUE ~ 5,
a == TRUE & b == FALSE & c == TRUE ~ 3
),
f =
case_when(
a == TRUE & b == TRUE & c == TRUE ~ 2,
a == TRUE & b == FALSE & c == TRUE ~ 3
))
这给你:
a b c d e f
<lgl> <lgl> <lgl> <dbl> <dbl> <dbl>
1 TRUE TRUE TRUE 5 5 2
2 TRUE FALSE TRUE 2 3 3
3 TRUE FALSE TRUE 2 3 3
数据:
df <- tribble(
~a, ~b, ~c,
TRUE, TRUE, TRUE,
TRUE, FALSE, TRUE,
TRUE, FALSE, TRUE
)