【问题标题】:Convert dataframe to 1 and 0将数据框转换为 1 和 0
【发布时间】:2019-10-09 00:56:19
【问题描述】:

我有一个像这样的大标题:

a b c d e f
1 1 1 0 0 1
4 5 1 1 0 1
3 1 0 0 0 0 

并将其转换为这个(理想情况下使用 tidyverse),因此 0 保留,而 1 和更大的转换为 1:

a b c d e f 
1 1 1 0 0 1
1 1 1 1 0 1
1 1 0 0 0 0 

变量有不同的名称,从第二列到最后一列。

谢谢!

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    tidyverse 方法可能是:

    library(dplyr)
    
    df %>%
       mutate_all(~ +(.x > 0))
    
      a b c d e f
    1 1 1 1 0 0 1
    2 1 1 1 1 0 1
    3 1 1 0 0 0 0
    

    如果您想要转换除第一列之外的所有内容,您可以这样做:

    df %>%
      mutate_at(vars(-1), ~ +(.x > 0))
    

    【讨论】:

    • 我想你可以不用mutate_all, +(df > 0)
    • @RonakShah - 绝对 - 这个答案是对 OP 声明“理想情况下使用 tidyverse”的回应。
    【解决方案2】:

    您可以使用pmin,它将在 1 和数据框中的值之间选择最小值。

    pmin(df, 1)
    
    #  a b c d e f
    #1 1 1 1 0 0 1
    #2 1 1 1 1 0 1
    #3 1 1 0 0 0 0
    

    数据

    df <- structure(list(a = c(1L, 4L, 3L), b = c(1L, 5L, 1L), c = c(1L, 
    1L, 0L), d = c(0L, 1L, 0L), e = c(0L, 0L, 0L), f = c(1L, 1L, 
    0L)), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

    • 也许我在做一些奇怪的事情,但我得到了意想不到的结果,例如:set.seed(1); df &lt;- data.frame(matrix(sample(0:5,10,replace=TRUE),nrow=5))
    • 另一方面,df[] &lt;- lapply(df, pmin, 1) 确实按预期工作。
    • @thelatemail 是的,我也收到了NAs,这很奇怪。转换为矩阵工作 pmin(as.matrix(df), 1) 但为什么 pmin(df, 1) 不能直接工作?特别是当帖子中的df 也是数据框时。
    • 这似乎有点棘手,但我认为这是有道理的,因为像 mean(df) 这样的函数不再像那样工作了。将pmin 与任何不是向量的东西一起使用时,似乎会有一些时髦的转换。这似乎可能值得进行错误讨论。至少可以指定更好的警告消息。
    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多