首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将df中的值更改为0= FALSE,1= TRUE,2= TRUE

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

Stack Overflow用户
提问于 2019-01-15 19:17:17
回答 3查看 1.9K关注 0票数 1

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

我试了试deplyr`s的case_when,但它没有达到预期的结果。

代码语言:javascript
运行
复制
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结构。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-15 19:42:02

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

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-01-15 19:20:51

这在base R中非常简单:

代码语言:javascript
运行
复制
test[,-1] <- lapply(test[,-1], as.logical)

默认情况下,0对应于FALSE,所有其他值都对应于TRUE,因此as.logical会为您执行此操作。也许用dplyr也很容易做到这一点,在`case_when´中你绝对不需要那么多行。

票数 1
EN

Stack Overflow用户

发布于 2019-01-15 19:24:55

在基本R中,可以这样做:

代码语言:javascript
运行
复制
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,你可以这样做:

代码语言:javascript
运行
复制
test[-1] <- 
  test %>%
  select(-"ID") %>%
  mutate_all(
    funs(
      case_when(
        . == 0 ~ FALSE,
        . %in% 1:2 ~ TRUE
      )
    )
  )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54197782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档