gpt4 book ai didi

r - 有没有更简单的用交替模式重命名列的版本?还是 tidyverse 方法?

转载 作者:行者123 更新时间:2023-12-05 00:51:52 24 4
gpt4 key购买 nike

我的数据

所以我有一个正在使用的数据框:

structure(list(V1 = c(3L, 3L, 3L, 2L, 4L, 1L), V2 = c(1L, 1L, 
1L, 1L, 1L, 1L), V3 = c(2L, 2L, 2L, 1L, 3L, 2L), V4 = c(2L, 2L,
3L, 1L, 1L, 1L), V5 = c(3L, 3L, 4L, 1L, 3L, 3L), V6 = c(3L, 3L,
4L, 3L, 3L, 3L), V7 = c(2L, 2L, 1L, 1L, 3L, 3L), V8 = c(3L, 3L,
4L, 4L, 3L, 3L), V9 = c(3L, 3L, 3L, 2L, 3L, 3L), V10 = c(2L,
2L, 1L, 1L, 1L, 1L)), row.names = c(NA, 6L), class = "data.frame")

看起来像这样:

 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 3 1 2 2 3 3 2 3 3 2
2 3 1 2 2 3 3 2 3 3 2
3 3 1 2 3 4 4 1 4 3 1
4 2 1 1 1 1 3 1 4 2 1
5 4 1 3 1 3 3 3 3 3 1
6 1 1 2 1 3 3 3 3 3 1

目前的解决方案

我想出的快速重命名变量的最佳代码是这样的:

new_names <- outer("cope",
1:10,
paste,
sep="_")
names(data1) <- new_names
data1

这给了我这个数据框:

  cope_1 cope_2 cope_3 cope_4 cope_5 cope_6 cope_7 cope_8 cope_9 cope_10
1 3 1 2 2 3 3 2 3 3 2
2 3 1 2 2 3 3 2 3 3 2
3 3 1 2 3 4 4 1 4 3 1
4 2 1 1 1 1 3 1 4 2 1
5 4 1 3 1 3 3 3 3 3 1
6 1 1 2 1 3 3 3 3 3 1

问题

虽然这很好地满足了我的目的,但它让我为 future 考虑了两个问题。首先,有没有办法简化代码以使其成为一行?如果可能的话,我正在考虑在 dplyr 中工作的东西,因为这是我最习惯使用的东西。

其次,如果有 30 个变量,其中一些具有重复模式,一些具有独特性,我预见到问题即将出现。重命名这些变量时,最经济的时间使用是什么?我知道 rep 是一种选择,但我只知道它如何重复但不能将值分成多个模式。我正在考虑这样的事情,用某种模式和停止写起来会更容易:

names <- c("v1","v2","v3","c1","c2","c3","u","p","z1","z2")

例如:

names <- c("v1","v2","v3","c1","c2","c3","u","p","z1","z2")
colnames(data1) <- names
data1

v1 v2 v3 c1 c2 c3 u p z1 z2
1 3 1 2 2 3 3 2 3 3 2
2 3 1 2 2 3 3 2 3 3 2
3 3 1 2 3 4 4 1 4 3 1
4 2 1 1 1 1 3 1 4 2 1
5 4 1 3 1 3 3 3 3 3 1
6 1 1 2 1 3 3 3 3 3 1
7 3 1 3 1 3 2 2 2 3 2
8 3 2 1 2 3 2 3 3 2 1
9 3 2 4 1 2 4 2 3 4 1
10 4 2 4 2 3 4 3 3 4 1

如果你手动拼出来,这很耗时:

names <- c("cope_1", "cope_2","cope_3","sad_1","sad_2","sad_3","u","p","zip_1","zip_2")
colnames(data1) <- names
data1

这确实让你得到你想要的,但速度很慢:

  cope_1 cope_2 cope_3 sad_1 sad_2 sad_3 u p zip_1 zip_2
1 3 1 2 2 3 3 2 3 3 2
2 3 1 2 2 3 3 2 3 3 2
3 3 1 2 3 4 4 1 4 3 1
4 2 1 1 1 1 3 1 4 2 1
5 4 1 3 1 3 3 3 3 3 1
6 1 1 2 1 3 3 3 3 3 1

outer 这样的东西似乎不适合这里:

outer("cope",
1:3,
paste,
sep="_",
"sad",
1:3,
paste,
sep="_",
"u",
"p")

因此,如果有更好的方法来命名像​​这样的变量 block ,那就太好了。

最佳答案

一个解决方案可能是这样的:

library(dplyr)

df %>%
setNames(paste0("cope_", seq_len(ncol(df))))

cope_1 cope_2 cope_3 cope_4 cope_5 cope_6 cope_7 cope_8 cope_9 cope_10
1 3 1 2 2 3 3 2 3 3 2
2 3 1 2 2 3 3 2 3 3 2
3 3 1 2 3 4 4 1 4 3 1
4 2 1 1 1 1 3 1 4 2 1
5 4 1 3 1 3 3 3 3 3 1
6 1 1 2 1 3 3 3 3 3 1

关于r - 有没有更简单的用交替模式重命名列的版本?还是 tidyverse 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71003142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com