Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据逻辑列的顺序在DF中创建多个新列_R_Dataframe_Tidyverse_Data Wrangling - Fatal编程技术网

R 根据逻辑列的顺序在DF中创建多个新列

R 根据逻辑列的顺序在DF中创建多个新列,r,dataframe,tidyverse,data-wrangling,R,Dataframe,Tidyverse,Data Wrangling,我试图创建三个新列,其值取决于三个逻辑类型列的特定顺序 我有这个: 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 
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

df[c('d','e','f')]这里有一个
dplyr
解决方案,使用
case\u时
。在
~
的左侧定义条件,在
~
的右侧指定满足这些条件时的值。如果不满足条件(即所有假值),您将返回
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
abcdef
1正确5正确5 2
2对错对2 3 3 3
3对错对2 3 3 3
数据:

df
df <- tribble(
  ~a, ~b, ~c,
  TRUE, TRUE, TRUE,
  TRUE, FALSE, TRUE,
  TRUE, FALSE, TRUE
)