代码之家  ›  专栏  ›  技术社区  ›  cs0815

将列名称与数据框中的因子级别相结合

r
  •  1
  • cs0815  · 技术社区  · 6 年前

    我有这个:

    df1 <- data.frame(A = c('a', 'b', 'c'), B = c('d', 'e', 'c'))
    

    并希望将其转换为:

        A   B
    1 A:a B:d
    2 A:b B:e
    3 A:c B:c
    

    我当前不工作的“循环”尝试(首选使用应用版本)如下:

    for (row in 1:nrow(df1)) {
        for (col in 1:ncol(df1)) {
            levels(colnames(df1)[col])[levels(colnames(df1)[col]) == df1[row, col]] <- paste0(colnames(df1)[col], ":", df1[row, col])
        }
    }
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   LyzandeR    6 年前

    一种方式 mapply :

    data.frame(mapply(function(x, y) paste0(y, ':', x), df1, c('A', 'B')))
    #    A   B
    #1 A:a B:d
    #2 A:b B:e
    #3 A:c B:c
    

    或者你可以这样做:

    data.frame(A = paste0('A:', df1$A),
               B = paste0('B:', df1$B))
    

    但是,如果您有多个要在其上使用此逻辑的列,我将选择第一个选项。

        2
  •  3
  •   Ronak Shah    6 年前

    使用选项 lapply 我们从每一列中穿过, paste 列的名称以及列值。

    df1[] <- lapply(seq_along(df1), function(x) paste0(names(df1)[x],":", df1[,x]))
    
    df1
    #    A   B
    #1 A:a B:d
    #2 A:b B:e
    #3 A:c B:c
    
        3
  •  1
  •   tmfmnk    6 年前

    如果你想用 tidyverse :

    df1 %>%
     rowid_to_column() %>% #Creating row IDs
     gather(var, val, -rowid) %>% #Transforming the data from wide to long
     mutate(temp = paste(var, val, sep = ":")) %>% #Combining the column names with the level of factors
     select(-val) %>%
     spread(var, temp) %>% #Transforming the data back to wide format
     select(-rowid) #Deleting the redundant variable
    
        A   B
    1 A:a B:d
    2 A:b B:e
    3 A:c B:c