如何循环r中的多个列

  • 本文关键字:何循环 循环 r
  • 更新时间 :
  • 英文 :


我有数据框架,我在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'))

最新更新