R:如何在一个df中循环或套用行,并在另一个df中使用信息

我有一个带有测试用例的df(例如,如果X = 1并且Y = 0则cat ='3'),以及一个带有待测试值的附加数据框

df <- data.frame('tc' = c('X==1 & Y!=1 ','X==0 & Y!=1','X==1 & Y==1'), "cat" = 1:3)
Data <- data.frame(X = c('1','0', '1','1', '1'), Y = c('1','0', '1','0', '1'))

我目前只能通过使用来测试一个测试用例

#first testcase
Data <- within(Data, cat_test <- ifelse((X==1 & Y!=1 ), paste(df$cat[1]), 0))
table(Data$cat_test )

#second testcase
Data <- within(Data, cat_test <- ifelse((X==0 & Y!=1 ), paste(df$cat[2]), Data$cat_test))
table(Data$cat_test )

#...and so on...

我想使用lapply或类似的方法遍历数据帧并测试每个测试用例,例如

Data <- within(Data, test <- ifelse(paste(df$tc), paste(df$cat), Data$test))

那可能吗?

评论
  • Oo晓oO
    Oo晓oO 回复

    您可以这样做:

    library(dplyr)
    Data %>%
      mutate(cat = case_when(X == 1 & Y != 1 ~ 1,
                             X == 0 & Y != 1 ~ 2,
                             X == 1 & Y == 1 ~ 3))
    

    结果是:

      X Y cat
    1 1 1   3
    2 0 0   2
    3 1 1   3
    4 1 0   1
    5 1 1   3
    
  • 蔓延2j
    蔓延2j 回复

    创建一个包含代码的字符串以计算类别,然后对其进行解析和评估。我们假设条件是互斥的(在问题中就是这种情况),并且如果没有一个条件为TRUE,则默认值为0(但问题中没有这样的情况)。不使用任何软件包。

    txt <- with(df, paste( sprintf("%d*(%s)", cat, tc), collapse = "+"))
    transform(Data, cat = eval(parse(text = txt)))
    

    给予:

      X Y cat
    1 1 1   3
    2 0 0   2
    3 1 1   3
    4 1 0   1
    5 1 1   3
    

    Note that txt is:

    > txt
    [1] "1*(X==1 & Y!=1 )+2*(X==0 & Y!=1)+3*(X==1 & Y==1)"