如何修改R代码,在x42、y42后生成新行?
解决方案
首先保留原始的数据生成代码不变:
set.seed(123) df <- data.frame(x = as.numeric(rnorm(42)), y = rnorm(42))
针对你的需求——将数据转换为多行宽格式,每一行包含完整的x1到x42,并依次对应y1、y2……y42(即第一行对应y1,第二行从x1开始并对应y2,以此类推),可以修改代码如下:
library(tidyverse) # 先将x列转换为包含x1到x42的单行宽格式数据 x_wide <- df %>% mutate(x_id = row_number()) %>% pivot_wider(names_from = x_id, values_from = x, names_prefix = "x") # 生成多行结果:每行复用x_wide的内容,对应一个y值 result <- df %>% bind_cols(x_wide %>% slice(rep(1(), nrow(df)))) %>% # 调整列顺序,让x系列列在前,y列在后 select(starts_with("x"), y) # 查看前几行结果验证 head(result)
代码说明:
- 构建x的宽格式基础:把原始的
x列转换为包含x1到x42的单行数据,作为后续每行的固定部分。 - 匹配y值生成多行:将原始
y列的每个值作为单独一行,同时把x的宽格式数据复制到每一行,实现每行都包含完整的x1-x42和对应的y值。 - 调整列顺序:确保
x相关列在前,y列在后,符合常规阅读逻辑。
如果你的需求是生成多行完整的x1,y1,x2,y2,…,x42,y42格式(即重复原始宽格式行并替换y系列值),可以使用以下代码:
library(tidyverse) result <- df %>% pivot_longer(c(x,y)) %>% group_by(name) %>% mutate(name = str_c(name, row_number())) %>% pivot_wider(names_from = name, values_from = value) %>% # 生成42行重复结构 slice(rep(1(), 42)) %>% # 替换每行的y1-y42为对应位置的y值 mutate(across(starts_with("y"), ~ df$y[row_number()]))
内容的提问来源于stack exchange,提问作者user22178063
相关产品推荐
相关产品推荐

