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))
我想改变数据框的列内容,以便单元格内容以列名称为前缀:
> 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))