Префикс / суффикс содержимого столбца с именами столбцов - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу изменить содержимое столбца фрейма данных так, чтобы содержимое ячейки начиналось с префикса имени столбца:

> x <- data.frame(VarX = rep(c("A","B"),2), VarY = rep(c("C","D"),2))
> x
  VarX VarY
1    A    C
2    B    D
3    A    C
4    B    D
> x$VarX <- paste0("VarX", x$VarX)
> x$VarY <- paste0("VarY", x$VarY)
> x
   VarX  VarY
1 VarXA VarYC
2 VarXB VarYD
3 VarXA VarYC
4 VarXB VarYD

, но в общем.Самое близкое, что я получил, это:

x <- data.frame(VarX = rep(c("A","B"),2), VarY = rep(c("C","D"),2))
columns = c("VarX", "VarY")

for(col in columns)
{
  x <- x %>% mutate_at( .vars = col, ~paste0(col, .) )
}
x

, но мне не нравится цикл for.Может ли кто-нибудь улучшить код?

Также обратите внимание на код для работы с выбором столбца x.

x <- data.frame(VarX = rep(c("A","B"),2), VarY = rep(c("C","D"),2),
  num = 1:4)

и я хочу изменить только столбцы VarX и VarY.

Ответы [ 5 ]

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

В базе r

data.frame(matrix(paste0(sort(rep(names(x),4L)), unlist(x)), ncol = 2))
0 голосов
/ 13 декабря 2018

Мы можем использовать imap, который также будет включать имена столбцов каждого столбца, если нам нужно извлечь.Здесь мы paste имена столбцов (.y) со значениями столбцов (.x)

library(tidyverse)
imap(x, ~ paste0(.y, .x)) %>%
    bind_cols
# A tibble: 4 x 2
#  VarX  VarY 
#   <chr> <chr>
#1 VarXA VarYC
#2 VarXB VarYD
#3 VarXA VarYC
#4 VarXB VarYD

РЕДАКТИРОВАТЬ: на основе комментариев @ Moody_Mudskipper

imap_dfc(x, ~ paste0(.y, .x))

Или, используя base R, мы paste дублируем имена столбцов 'x' с matrix из 'x' и присваиваем его начальным data.frame

x[] <- paste0(rep(colnames(x), each = nrow(x)), as.matrix(x))
x
#   VarX  VarY
#1 VarXA VarYC
#2 VarXB VarYD
#3 VarXA VarYC
#4 VarXB VarYD
0 голосов
/ 13 декабря 2018

Вы можете попробовать mapply, то есть

x[] <- mapply(paste0, names(x), x)

, что дает,

   VarX  VarY
1 VarXA VarYC
2 VarXB VarYD
3 VarXA VarYC
4 VarXB VarYD
0 голосов
/ 13 декабря 2018

Решение с purrr:

purrr::map2_dfc(colnames(x), x, paste0)
# A tibble: 4 x 2
  V1    V2   
  <chr> <chr>
1 VarXA VarYC
2 VarXB VarYD
3 VarXA VarYC
4 VarXB VarYD

Если у вас есть больше столбцов, это также работает, просто подмените те, которые вам нужно изменить:

cols <- c("VarX", "VarY")
x[, cols] <- purrr::map2_dfc(cols, x[,cols], paste0)
x
#    VarX  VarY VarZ
# 1 VarXA VarYC    E
# 2 VarXB VarYD    F
# 3 VarXA VarYC    E
# 4 VarXB VarYD    F

Данные:

x <- data.frame(VarX = rep(c("A","B"),2), 
                VarY = rep(c("C","D"),2), 
                VarZ = rep(c("E","F"),2))
0 голосов
/ 13 декабря 2018

Мы можем использовать lapply

x[] <- lapply(seq_along(x), function(i) paste0(names(x)[i], x[,i]))
x

#   VarX  VarY
#1 VarXA VarYC
#2 VarXB VarYD
#3 VarXA VarYC
#4 VarXB VarYD

Вы можете использовать соответствующий sep аргумент в paste0, чтобы он выглядел чистым.


Если у вас больше числастолбцов, и вы хотите выбрать только некоторые из них, вы можете сделать

cols <- c("VarX","VarY")
x[cols] <- lapply(seq_along(x[cols]), function(i) paste0(names(x)[i], x[,i]))

x
#   VarX  VarY num
#1 VarXA VarYC   1
#2 VarXB VarYD   2
#3 VarXA VarYC   3
#4 VarXB VarYD   4
...