Prefix/suffix 包含列名的列内容

Prefix/suffix column content with column names

我想改变数据框的列内容,以便单元格内容以列名称为前缀:

> 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 列。

我们可以使用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

您可以在 paste0 中使用适当的 sep 参数使其看起来干净。


如果您有更多的列并且您只想select其中的一些,您可以

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

您可以尝试mapply,即

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

这给出了,

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

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))

我们可以使用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' 的复制列名称与 'x' 的 matrix 并将其分配给初始 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

基地r

data.frame(matrix(paste0(sort(rep(names(x),4L)), unlist(x)), ncol = 2))