【问题标题】:Creating new columns based on existing columns in R基于 R 中的现有列创建新列
【发布时间】:2020-01-29 21:26:20
【问题描述】:

这是我的数据框的示例。它来自一项调查,最初的问题是:“你在哪里?标记所有适用的。”

Code   Option1   Option2   Option3   Option4
101        A        C         NA        NA
102        B        D         NA        NA
103        A        B         D         NA
104        D        NA        NA        NA
105        A        B         C         D

我想转换此数据,以便每一列都是其中一个位置,如果您位于 4 个位置中的任何一个,您将得到 0/1:

Code   A   B   C   D
101    1   0   1   0
102    0   1   0   1
103    1   1   0   1
104    0   0   0   1
105    1   1   1   1

我尝试使用 ifelse 语句,但一直出错。有什么建议么?谢谢!

【问题讨论】:

    标签: r dataframe if-statement


    【解决方案1】:

    使用tidyverse

    library(dplyr)
    library(tidyr)
    df1 %>%
        pivot_longer(cols = -Code, values_drop_na = TRUE) %>% 
        mutate(n = 1) %>% 
        select(-name) %>% 
        pivot_wider(names_from = value, values_from = n, values_fill = list(n = 0)) %>%
        select(Code, LETTERS[1:4])
    #   Code A B C D
    #1  101 1 0 1 0
    #2  102 0 1 0 1
    #3  103 1 1 0 1
    #4  104 0 0 0 1
    #5  105 1 1 1 1
    

    或使用mtabulate

    library(qdapTools)
    cbind(df1[1], +(mtabulate(as.data.frame(t(df1[-1]))) > 0))
    

    或使用melt/dcast

    library(data.table)
    dcast(melt(setDT(df1), id.var = 'Code', na.rm = TRUE), Code ~ value, length)
    

    【讨论】:

      【解决方案2】:

      我在使用 gsub 将 True/False 调查响应转换为二进制 1,0 时完成了这项工作:

      t <- function(x) gsub("A",1,x)
      f <- function(x) gsub("B",0,x)
      
      df[1:4] <- lapply(df[1:4], t)
      df[1:4] <- lapply(df[1:4], f)
      

      我确信有更好的方法可以做到这一点,但这对我有用。

      【讨论】:

        【解决方案3】:

        你可以试试:

        tab <- table(cbind(df[1], unlist(df[-1])))
        cbind(Code = row.names(tab), as.data.frame.matrix(tab), row.names = NULL)
        
          Code A B C D
        1  101 1 0 1 0
        2  102 0 1 0 1
        3  103 1 1 0 1
        4  104 0 0 0 1
        5  105 1 1 1 1
        

        【讨论】:

          【解决方案4】:

          假设 'df1' 是您的表格,这种方法需要多几行但很容易理解:

          library(tidyverse)
          library(reshape2)
          
          df1 %>% 
            gather(Code) %>% 
            dcast(Code ~ value, fun.aggregate=length) %>%
            select(-'NA')
          

          你的结果是:

            Code A B C D
          1  101 1 0 1 0
          2  102 0 1 0 1
          3  103 1 1 0 1
          4  104 0 0 0 1
          5  105 1 1 1 1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-19
            • 2020-09-07
            • 2014-04-28
            • 1970-01-01
            • 2020-12-23
            • 1970-01-01
            相关资源
            最近更新 更多