【问题标题】:Replace 1s with column names in a dataframe [duplicate]用数据框中的列名替换 1s [重复]
【发布时间】:2019-12-06 08:33:53
【问题描述】:

我的数据如下所示:

df<-data.frame(
 hhid = c(5668,5595,4724,4756,4856,4730,4757,6320,4758,6319,6311,5477,6322),

 pid=c(93660,93660,100960,100960,100960,100960,100960,100962,100960,100962,100962,93814,100962),

 pname=c("AB","HG","DC","DC","DC","DC","DC","BA","DC","BA","BA","BH","BA"),

 vid=c(462962,608757,772284,772284,772284,293475,293475,656323,293475,656323,81533,465612,656323),

 vname=c("ABCD","KJUI","HIND","HIND","HIND","KAJA","KAJA","ADAR","KAJA","ADAR","SANG","NARI","ADAR"),

 me=c(1,1,0,0,0,0,0,1,0,0,0,1,0),

 ls=c(0,0,1,1,0,1,0,0,1,0,0,0,1),

 lg=c(0,0,0,0,0,0,1,0,0,1,0,0,0),

 lo=c(0,0,0,0,1,0,0,0,0,0,1,0,0),

 amt=c(20000,20000,14000,14000,14000,14000,14000,27000,14000,27000,27000,20000,23000))

此数据中有超过 20000 行。 hhid,pid,pname,vid,vname,ls,lg,lo,amt 是列名。每个 hhid 都是独一无二的。

我需要的输出是这样的:

hhid   pid      pname      vid        vname       LOS         amt
5668    93660     AB      462962    ABCD          me         20000
5595    93660     HG      608757    KJUI          me         20000
4724    100960    DC      772284    HIND          ls         14000
4756    100960    DC      772284    HIND          ls         14000
4856    100960    DC      772284    HIND          lo         14000
and so on. 

所以基本上我想要的是用包含列名 me、ls、lg、lo 作为新行数据的 NEW COLUMN LOS 替换 me、ls、lg、lo 列中的 1。即用列名替换 1s 和将其保存到新列 LOS。

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以这样做:

    df$LOS <- c("me", "ls", "lg", "lo")[apply(df[, c("me", "ls", "lg", "lo")]==1, 1, which)]
    # > df
    #    hhid    pid pname    vid vname me ls lg lo   amt LOS
    # 1  5668  93660    AB 462962  ABCD  1  0  0  0 20000  me
    # 2  5595  93660    HG 608757  KJUI  1  0  0  0 20000  me
    # 3  4724 100960    DC 772284  HIND  0  1  0  0 14000  ls
    # 4  4756 100960    DC 772284  HIND  0  1  0  0 14000  ls
    # 5  4856 100960    DC 772284  HIND  0  0  0  1 14000  lo
    # 6  4730 100960    DC 293475  KAJA  0  1  0  0 14000  ls
    # 7  4757 100960    DC 293475  KAJA  0  0  1  0 14000  lg
    # 8  6320 100962    BA 656323  ADAR  1  0  0  0 27000  me
    # 9  4758 100960    DC 293475  KAJA  0  1  0  0 14000  ls
    # 10 6319 100962    BA 656323  ADAR  0  0  1  0 27000  lg
    # 11 6311 100962    BA  81533  SANG  0  0  0  1 27000  lo
    # 12 5477  93814    BH 465612  NARI  1  0  0  0 20000  me
    # 13 6322 100962    BA 656323  ADAR  0  1  0  0 23000  ls
    

    或(定义列名向量)

    cols <- c("me", "ls", "lg", "lo")
    df$LOS <- cols[apply(df[, cols]==1, 1, which)]
    

    【讨论】:

      【解决方案2】:

      您可以将数据转换为更长的格式,filter 行带有value = 1

      library(dplyr)
      
      tidyr::pivot_longer(df, cols = c(me, ls, lg, lo), names_to = "LOS") %>%
        filter(value == 1) %>%
        select(-value)
      
      #   hhid    pid pname    vid vname   amt LOS 
      #   <dbl>  <dbl> <fct>  <dbl> <fct> <dbl> <chr>
      # 1  5668  93660 AB    462962 ABCD  20000 me   
      # 2  5595  93660 HG    608757 KJUI  20000 me   
      # 3  4724 100960 DC    772284 HIND  14000 ls   
      # 4  4756 100960 DC    772284 HIND  14000 ls   
      # 5  4856 100960 DC    772284 HIND  14000 lo   
      # 6  4730 100960 DC    293475 KAJA  14000 ls   
      # 7  4757 100960 DC    293475 KAJA  14000 lg   
      # 8  6320 100962 BA    656323 ADAR  27000 me   
      # 9  4758 100960 DC    293475 KAJA  14000 ls   
      #10  6319 100962 BA    656323 ADAR  27000 lg   
      #11  6311 100962 BA     81533 SANG  27000 lo   
      #12  5477  93814 BH    465612 NARI  20000 me   
      #13  6322 100962 BA    656323 ADAR  23000 ls   
      

      【讨论】:

        【解决方案3】:

        基础 R 解决方案:

        df <- transform(df[!(names(df) %in% c("me", "ls", "lg", "lo"))], 
        
                        name = names(df)[(names(df) %in% c("me", "ls", "lg", "lo"))][apply(df[(names(df) %in% c("me", "ls", "lg", "lo"))], 1, which.max)])
        

        数据:

        df <- data.frame(
        
          hhid = c(5668,5595,4724,4756,4856,4730,4757,6320,4758,6319,6311,5477,6322),
        
          pid=c(93660,93660,100960,100960,100960,100960,100960,100962,100960,100962,100962,93814,100962),
        
          pname=c("AB","HG","DC","DC","DC","DC","DC","BA","DC","BA","BA","BH","BA"),
        
          vid=c(462962,608757,772284,772284,772284,293475,293475,656323,293475,656323,81533,465612,656323),
        
          vname=c("ABCD","KJUI","HIND","HIND","HIND","KAJA","KAJA","ADAR","KAJA","ADAR","SANG","NARI","ADAR"),
        
          me=c(1,1,0,0,0,0,0,1,0,0,0,1,0),
        
          ls=c(0,0,1,1,0,1,0,0,1,0,0,0,1),
        
          lg=c(0,0,0,0,0,0,1,0,0,1,0,0,0),
        
          lo=c(0,0,0,0,1,0,0,0,0,0,1,0,0),
        
          amt=c(20000,20000,14000,14000,14000,14000,14000,27000,14000,27000,27000,20000,23000))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-16
          • 1970-01-01
          • 2021-12-31
          • 2019-03-31
          • 2023-04-02
          • 2019-02-19
          • 2020-06-19
          • 1970-01-01
          相关资源
          最近更新 更多