【问题标题】:Create dummy-column based on another columns基于另一列创建虚拟列
【发布时间】:2018-04-27 09:36:27
【问题描述】:

假设我有这个数据集

> example <- data.frame(a = 1:10, b = 10:1, c = 1:5 )

我想创建一个新变量d。当至少在变量a b c 中存在值 1 2 或 3 时,我希望在 d 中获得值 1。 d 应该是这样的:

d <- c(1, 1, 1, 0, 0, 1, 1, 1, 1, 1)

提前致谢。

【问题讨论】:

    标签: r multiple-columns dummy-variable


    【解决方案1】:

    您可以使用rowSums 获取出现在每一行中的1, 2 or 3 的逻辑向量并将其包装在as.integer 中以转换为0和1,即

    as.integer(rowSums(df == 1|df == 2| df == 3) > 0)
    #[1] 1 1 1 0 0 1 1 1 1 1
    

    【讨论】:

      【解决方案2】:

      适用于任意数量的变量:

      example <- data.frame(a = 1:10, b = 10:1, c = 1:5 )
      x <- c(1, 2, 3)
      as.integer(Reduce(function(a, b) (a %in% x) | (b %in% x), example))
      

      【讨论】:

        【解决方案3】:

        使用dplyr 包:

        library(dplyr)
        x <- 1:3
        example %>% mutate(d = as.integer(a %in% x | b %in% x | c %in% x))
        

        【讨论】:

          【解决方案4】:

          另外两种适用于任意数量列的可能性:

          #option 1
          example$d <- +(rowSums(sapply(example, `%in%`, 1:3)) > 0)
          
          #option 2
          library(matrixStats)
          example$d <- rowMaxs(+(sapply(example, `%in%`, 1:3)))
          

          两者都给出:

          > example
              a  b c d
          1   1 10 1 1
          2   2  9 2 1
          3   3  8 3 1
          4   4  7 4 0
          5   5  6 5 0
          6   6  5 1 1
          7   7  4 2 1
          8   8  3 3 1
          9   9  2 4 1
          10 10  1 5 1
          

          【讨论】:

            【解决方案5】:

            您可以使用 apply 来执行此操作(虽然有点慢)

            逻辑any 将比较是否存在任何 1,2 或 3,apply 用于在每一行上迭代此逻辑。然后最后通过添加 +0 将布尔结果转换为数字(您可以在这里选择as.numeric,以防您想要更具表现力)

            d <- apply(example,1 ,function(x)any(x==1|x==2|x==3))+0
            

            如果有人想限制列或想在某些列上运行逻辑,那么也可以这样做:

            d <- apply(example[,c("a","b","c")], 1, function(x)any(x==1|x==2|x==3))+0
            

            在这里,您可以控制根据您的需要选择或忽略哪一列。

            输出

            > d
             [1] 1 1 1 0 0 1 1 1 1 1
            

            【讨论】:

            • 感谢您的快速回答。如果我有第四个变量怎么办,但我不在乎里面有什么。在第四个变量中使用“任何”值 1,2,3 也会被考虑....
            • @AmelioTornincasa ,是的,这将迭代您的 data.frame 上存在的每个变量
            【解决方案6】:

            一般解决方案:

            example %>%
            sapply(function(i)i %in% x) %>% apply(1,any) %>% as.integer
            #[1] 1 1 1 0 0 1 1 1 1 1
            

            【讨论】:

              【解决方案7】:

              试试这个方法,验证在任何列中是否存在x 中的列表一个元素。

              x<-c(1,2,3)
              example$d<-as.numeric(example$a %in% x | example$b %in% x | example$c %in% x)
              example
                  a  b c d
              1   1 10 1 1
              2   2  9 2 1
              3   3  8 3 1
              4   4  7 4 0
              5   5  6 5 0
              6   6  5 1 1
              7   7  4 2 1
              8   8  3 3 1
              9   9  2 4 1
              10 10  1 5 1
              

              【讨论】:

              • 这就是我要找的。谢谢你:)
              • 这是最好的答案——简单、快速、清晰的代码。不知道为什么它被否决了。在这里使用applydplyr 等是矫枉过正。如果您有 10 列,那可能会有所不同。
              • 谢谢@dash2。所有其他答案都运行良好,但在我的问题中,提问者还可以找到集成在其原始 data.frame 中的输出,我想这就是他想要的。
              猜你喜欢
              • 2022-10-24
              • 1970-01-01
              • 2019-03-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-06-19
              • 1970-01-01
              相关资源
              最近更新 更多