объединить имя столбца с уровнем факторов во фрейме данных - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть это:

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 ]

0 голосов
/ 03 декабря 2018

Опция, использующая 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
0 голосов
/ 03 декабря 2018

В случае, если вы хотите сделать это, используя 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
0 голосов
/ 03 декабря 2018

В одну сторону с 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))

Но я бы выбрал первый вариант, если у вас есть несколько столбцов, которые вы хотели быиспользовать эту логику на.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...