【问题标题】:R: How to loop or lapply over rows in one df and use the information in another dfR:如何循环或覆盖一个df中的行并使用另一个df中的信息
【发布时间】:2020-04-24 11:35:58
【问题描述】:

我有一个带有测试用例的 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))

这可能吗?

【问题讨论】:

    标签: r loops if-statement testing lapply


    【解决方案1】:

    创建一个字符串,其中包含计算类别的代码,然后对其进行解析和评估。我们假设条件是互斥的(问题中就是这种情况),并且如果没有一个条件为 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
    

    注意txt 是:

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

    如果条件不是互斥的,并且应该报告第一个为真的条件,则将其用作txt。如果没有一个为 TRUE,则使用 NA 作为类别。

    txt <- with(df, sprintf("c(%s)[max.col(cbind(%s,1) == 1, 'first')]",
      toString(cat), toString(tc)))
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      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
      

      【讨论】:

      • 谢谢,但问题是我的 df 包含超过 50 个测试用例,所以我需要一种方法来使用 df 中的信息,否则我必须将它们全部列出来?
      • 如果你不想自己写case_when()的正文,你可以使用这个并粘贴它:df %&gt;% transmute(extracted = paste0(tc, " ~ ", cat, ","))
      • 这行得通,除了我需要 df 中关于附加 df 'Data' 的信息。这不起作用: data %>% transmute(extracted = paste0(df$tc, " ~ ", df$cat, ","))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2020-09-25
      • 2019-09-04
      • 2023-02-23
      • 2016-09-16
      • 1970-01-01
      • 2019-12-22
      相关资源
      最近更新 更多