【问题标题】:Combination of for-loop and ifelse in RR中for循环和ifelse的组合
【发布时间】:2020-12-30 23:34:48
【问题描述】:

如果超出特定(和变量)值,我正在尝试在 R 中的“是”和“否”之间做出决定。 对于每个测试值,应创建一个包含不同决策的新列。

这是一个手动创建的示例:

Test.data <- data.frame(c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100))
colnames(Test.data) <- c("Test")

Test.data$Test1 <- ifelse(Test.data$Test > 10, "Yes", "No")
Test.data$Test2 <- ifelse(Test.data$Test > 20, "Yes", "No")
Test.data$Test3 <- ifelse(Test.data$Test > 30, "Yes", "No")

Test.data

这个简单的例子给出以下输出:

   Test Test1 Test2 Test3
1    10    No    No    No
2    20   Yes    No    No
3    30   Yes   Yes    No
4    40   Yes   Yes   Yes
5    50   Yes   Yes   Yes
6    60   Yes   Yes   Yes
7    70   Yes   Yes   Yes
8    80   Yes   Yes   Yes
9    90   Yes   Yes   Yes
10  100   Yes   Yes   Yes

有没有办法用 for 循环来做到这一点?我已经尝试过不同的东西,比如下面的代码,但这似乎是无稽之谈,因为它不会创建新列等等:

n = c(seq(from=10, to=100, by=10))

for(i in n) {
ifelse(Test.data$Test > i, "Yes", "No")
}

谢谢大家!

【问题讨论】:

    标签: r for-loop if-statement


    【解决方案1】:

    我们可以将ifelse 的输出分配(&lt;-)到使用paste 创建的字符串作为列名。另外,我们不是在n上循环,而是在'n'的序列上循环

    for(i in seq_along(n)) {
            Test.data[paste0("Test", i)] <- ifelse(Test.data$Test > n[i], "Yes", "No")
     }
    

    【讨论】:

      【解决方案2】:

      或许你可以试试下面的方法

      cbind(Test.data, ifelse(sapply(c(10, 20, 30), `<`, Test.data$Test), "Yes", "No"))
      

      给了

         Test   1   2   3
      1    10  No  No  No
      2    20 Yes  No  No
      3    30 Yes Yes  No
      4    40 Yes Yes Yes
      5    50 Yes Yes Yes
      6    60 Yes Yes Yes
      7    70 Yes Yes Yes
      8    80 Yes Yes Yes
      9    90 Yes Yes Yes
      10  100 Yes Yes Yes
      

      【讨论】:

        【解决方案3】:

        你可以使用purrr::map_dfc

        vals <- c(10, 20, 30)
        
        result <- cbind(Test.data, purrr::map_dfc(vals, 
                         ~ifelse(Test.data$Test > .x, 'Yes', 'No')))
        names(result)[-1] <- paste0('Test', seq_along(vals))
        result
        
        #   Test Test1 Test2 Test3
        #1    10    No    No    No
        #2    20   Yes    No    No
        #3    30   Yes   Yes    No
        #4    40   Yes   Yes   Yes
        #5    50   Yes   Yes   Yes
        #6    60   Yes   Yes   Yes
        #7    70   Yes   Yes   Yes
        #8    80   Yes   Yes   Yes
        #9    90   Yes   Yes   Yes
        #10  100   Yes   Yes   Yes
        

        【讨论】:

          猜你喜欢
          • 2020-03-08
          • 2018-11-11
          • 1970-01-01
          • 1970-01-01
          • 2021-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-11
          相关资源
          最近更新 更多