我有数据框架,我在R中使用下面的代码创建:
test_data <- data.frame(
id = c(1:10),
Test1 = c(NA, NA, F, F, T, T, T, NA, F, F),
Test2 = c(NA, NA, NA, F, F, F, F, T, T, T)
)
test_data
我想要这样的输出:如果Test1 = T那么"A",否则如果Test2 = T那么"其他"C".
我已经尝试使用ifelse()条件,但无法得到正确的输出。
test_data$test <- ifelse(test_data$Test1 == TRUE, "A",
ifelse(test_data$Test2 == TRUE, "B", 'C'))
table(test_data$test)
是否有任何方法我可以使用循环在R中的2列,就像我们如何在Python中的列表理解或使用zip()函数与for循环?
一个可能的解决方案:
library(dplyr)
test_data %>%
mutate(test = case_when(Test1 == T ~ "A",
Test2 == T ~ "B",
TRUE ~ "C"))
#> id Test1 Test2 test
#> 1 1 NA NA C
#> 2 2 NA NA C
#> 3 3 FALSE NA C
#> 4 4 FALSE FALSE C
#> 5 5 TRUE FALSE A
#> 6 6 TRUE FALSE A
#> 7 7 TRUE FALSE A
#> 8 8 NA TRUE B
#> 9 9 FALSE TRUE B
#> 10 10 FALSE TRUE B
问题是NA值返回NA,而不是FALSE。你可以这样做来处理它们。
ifelse(!test_data$Test1 %in% c(FALSE, NA), "A",
ifelse(!test_data$Test2 %in% c(FALSE, NA), "B", 'C'))
或让生活更简单,创建一个函数。
onlyTRUE <- function(x) replace(x, is.na(x), FALSE) == TRUE
ifelse(onlyTRUE(test_data$Test1), "A",
ifelse(onlyTRUE(test_data$Test2), "B", 'C'))