带列名的前缀/后缀列内容

时间:2018-12-13 14:05:17

标签: r dplyr tidy

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

> 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 :(得分:2)

您可以尝试mapply,即

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

给出,

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

答案 1 :(得分: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”的列名,其中matrix为“ x”,并将其分配给初始数据。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

r为基础

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