[英]Combination of for-loop and ifelse in R
I'm trying to decide between "Yes" and "No" in R, if a specific (and variable) value is exceeded.如果超出特定(和变量)值,我试图在 R 中的“是”和“否”之间做出决定。 For each value tested a new column with the different decisions should be created.对于每个测试的值,应该创建一个包含不同决策的新列。
Here is a manually created example:这是一个手动创建的示例:
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
This simple example gives the following output:这个简单的例子给出了以下 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
Is there a way to do this with a for-loop?有没有办法用 for 循环来做到这一点? I already tried different stuff like the following code, but it seems to be nonsense, since it doesn't create new columns and so on:我已经尝试过不同的东西,比如下面的代码,但这似乎是胡说八道,因为它不会创建新的列等等:
n = c(seq(from=10, to=100, by=10))
for(i in n) {
ifelse(Test.data$Test > i, "Yes", "No")
}
Thanks everyone!感谢大家!
We can do the assignment ( <-
) of the output from ifelse
to a string created with paste
for the column names.我们可以将 output 从ifelse
赋值 ( <-
) 到使用paste
创建的列名称字符串。 Also, instead of looping over n
, we do the loop over the sequence of 'n'此外,我们不循环遍历n
,而是遍历 'n' 的序列
for(i in seq_along(n)) {
Test.data[paste0("Test", i)] <- ifelse(Test.data$Test > n[i], "Yes", "No")
}
Perhaps you can try something like below也许你可以试试下面的东西
cbind(Test.data, ifelse(sapply(c(10, 20, 30), `<`, Test.data$Test), "Yes", "No"))
which gives这使
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
You can use purrr::map_dfc
:您可以使用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.