You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中交换每组A与E对应的value变量值

问题描述

我有一个包含两个变量的数据集,一个为字符型,一个为数值型:

structure(list(ID = c("A", "B", "C", "D", "E", "A", "B", "C", 
"D", "E", "A", "B", "C", "D", "E", "A", "B", "C", "D", "E"), 
value = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
15, 16, 17, 18, 19, 20)), class = "data.frame", row.names = c(NA, 
-20L))

我想要在每一组"A"和"E"的序列中,交换"value"变量对应的值。最终输出应如下所示:

ID   value
A      5
B      2
C      3
D      4
E      1
A      10
B      7 
C      8
D      9
E      6
A      15
B      12
C      13
D      14
E      11
A      20
B      17
C      18
D      19
E      16

注意:此处使用连续数字仅为示例,真实数据并非1到20的序列,因此依赖数值规律的解法并不适用。

解决方案

方法1:使用dplyr分组处理

通过创建分组标识,在每组内精准交换A和E对应的value值:

library(dplyr)

# 生成原始数据
df <- structure(list(ID = c("A", "B", "C", "D", "E", "A", "B", "C", 
"D", "E", "A", "B", "C", "D", "E", "A", "B", "C", "D", "E"), 
value = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
15, 16, 17, 18, 19, 20)), class = "data.frame", row.names = c(NA, 
-20L))

# 处理数据
df_processed <- df %>%
  # 按每5行(A-E为一组)创建分组标识
  mutate(group = (row_number() - 1) %/% 5) %>%
  group_by(group) %>%
  mutate(
    value = case_when(
      ID == "A" ~ value[ID == "E"],
      ID == "E" ~ value[ID == "A"],
      TRUE ~ value
    )
  ) %>%
  ungroup() %>%
  select(-group) # 移除临时分组变量

# 查看结果
print(df_processed)

方法2:使用基础R处理

无需额外包,用循环分组处理实现交换:

# 生成原始数据
df <- structure(list(ID = c("A", "B", "C", "D", "E", "A", "B", "C", 
"D", "E", "A", "B", "C", "D", "E", "A", "B", "C", "D", "E"), 
value = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
15, 16, 17, 18, 19, 20)), class = "data.frame", row.names = c(NA, 
-20L))

group_size <- 5 # 每组固定5行
num_groups <- nrow(df) %/% group_size

# 循环处理每组
for (i in 1:num_groups) {
  row_indices <- ((i-1)*group_size + 1):(i*group_size)
  group_ids <- df$ID[row_indices]
  group_values <- df$value[row_indices]
  
  # 定位A和E的位置
  a_pos <- which(group_ids == "A")
  e_pos <- which(group_ids == "E")
  
  # 交换value
  temp <- group_values[a_pos]
  group_values[a_pos] <- group_values[e_pos]
  group_values[e_pos] <- temp
  
  df$value[row_indices] <- group_values
}

# 查看结果
print(df)

两种方法均不依赖数值规律,仅根据ID标识和分组逻辑完成交换,适配真实数据场景。

内容的提问来源于stack exchange,提问作者user13069688

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:51:54