将df中的值更改为0 = FALSE,1 = TRUE,2 = TRUE

时间:2019-01-15 11:17:17

标签: r dplyr

我有一个包含0、1和2s的数据帧。 我的目标是切换这些值,以使它显示0为FALSE,而1或2为TRUE。

我尝试了deplyr的case_when,但没有实现希望的结果。

test <- data.frame("ID" = c("A", "B", "C", "D"),
                "Primary" = c(0,0,2,1),
               "Secondary" = c(1,0,1,2),
               "Tertiary" = c(2,1,0,0))

test <- case_when(
 test$Primary == 0 ~ "FALSE",
 test$Primary != 0 ~ "TRUE",
 test$Secondary == 0 ~ "FALSE",
 test$Secondary != 0 ~ "TRUE",
 test$Secretory == 0 ~ "FALSE",
 test$Secretory != 0 ~ "TRUE",
 test$Tertiary == 0 ~ "FALSE",
 test$Tertiary != 0 ~ "TRUE")

上面的代码给了我一个字符向量,所有结果都在一行中,但是我想保持df结构。

3 个答案:

答案 0 :(得分:1)

在基数R中这很容易:

test[,-1] <- lapply(test[,-1], as.logical)

默认情况下,0对应于FALSE,所有其他值对应于TRUE,因此as.logical会为您完成。也许使用dplyr也是很容易的,您肯定不需要在case_when中那么多行。

答案 1 :(得分:1)

您可以使用mutate_if将数字列更改为其逻辑等效项:

test %>% mutate_if(is.numeric,as.logical)
  ID Primary Secondary Tertiary
1  A   FALSE      TRUE     TRUE
2  B   FALSE     FALSE     TRUE
3  C    TRUE      TRUE    FALSE
4  D    TRUE      TRUE    FALSE

答案 2 :(得分:0)

R为基的情况下,可以这样做:

test[-1] <- test[-1] > 0
test
#   ID Primary Secondary Tertiary
# 1  A   FALSE      TRUE     TRUE
# 2  B   FALSE     FALSE     TRUE
# 3  C    TRUE      TRUE    FALSE
# 4  D    TRUE      TRUE    FALSE

如果您坚持使用dplyr + case_when,则可以这样做:

test[-1] <- 
  test %>%
  select(-"ID") %>%
  mutate_all(
    funs(
      case_when(
        . == 0 ~ FALSE,
        . %in% 1:2 ~ TRUE
      )
    )
  )