繁体   English   中英

R中for循环和ifelse的组合

[英]Combination of for-loop and ifelse in R

如果超出特定(和变量)值,我试图在 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

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

   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")
}

感谢大家!

我们可以将 output 从ifelse赋值 ( <- ) 到使用paste创建的列名称字符串。 此外,我们不循环遍历n ,而是遍历 'n' 的序列

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

也许你可以试试下面的东西

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

您可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM